Miguel Alejandro Bolivar Portilla
Informatics Engineer. Full-stack developer.
@darking360
https://slides.com/darking360/pycon2020#/
@darking360
@darking360
@darking360
@darking360
Empezar en un nuevo trabajo
Backend de la aplicacion ⚙️
Moralejas 🧙
@darking360
@darking360
Proyecto nuevo 😱
@darking360
@darking360
Funcionando por 3 años 😱
Mantiene a unos 10.000 usuarios 🙃
¿Cierto? 😅
@darking360
@darking360
Decisiones
Preguntas
Contexto
@darking360
Pixel art semi realista del ingeniero G ☝️
Legacy 💀
@darking360
@darking360
@darking360
Pixel art semi realista del ingeniero K ☝️
@darking360
@darking360
Probar caminos normales
Probar caminos anomalos
Las pruebas buenas, son las que fallan
@darking360
Pruebas unitarias
Pruebas end-to-end
@darking360
Sobreescribimos funciones
Cuándo fue llamada
Con qué parametros
Cuántas veces
@darking360
@darking360
@darking360
No solo almacenamientos tradicionales
Datos para validar la aplicacion
Respaldo mediante eventos
Acciones principales cubiertas
@darking360
class SegmentAnalyticsContext():
def __init__(self, action='', category='', event_name=None):
event_name = 'GENERIC_SEGMENT_EVENT' if not event_name else event_name
self.event_name = event_name
self.segment_event_data = {'properties': {
'source': 'python-api',
'category': category,
'action': action
}}
def send_event(self):
analytics.track(
event=self.event_name,
user_id=self.segment_event_data['user_id'],
anonymous_id=self.segment_event_data['anonymous_id'],
properties=self.segment_event_data['properties'],
)@darking360
@darking360
Respaldo de los eventos y mejores consultas
@darking360
Correos
Firmas
Almacenamiento externo
Búsquedas
@darking360
@darking360
INSTALLED_APPS = [
integraciones1,
integraciones
# ... integraciones
]@darking360
@darking360
Más clientes
Más demanda
Más trafico
Más problemas
¿Cómo escalar? 🧗
@darking360
Workers
Estado de las tareas
¿Qué pasa si van mal?
Reintentar tareas
@darking360
Servicios de terceros 💀
Celery
Rápido, probado, seguro, confiado por miles 💕
@darking360
Más facil que Celery
Tablero con estados
Mecanismos de reintento
Colas personalizadas 🤯
@darking360
@darking360
@darking360
Handshake 250 milisegundos a 10 segundos 😱
Por cada solicitud 💀
Encolemos en el API y desencolemos en las integraciones 🔥
@darking360
Rápido entre ambas aplicaciones
Todos los beneficios de MRQ
Mecanismos de reintento
@darking360
Yo llegando a la empresa ☝️
@darking360
@darking360
DEFAULT_PARAMS = {"parse": False}DEFAULT_PARAMS = {"parse": False}
def mutability_on(new_params):
updated_params = DEFAULT_PARAMS
updated_params.update(new_params)
# Explosion de aqui hacia abajo 💣@darking360
Eventos de Segment al rescate
from copy import deepcopy
DEFAULT_PARAMS = {"parse": False}
def mutability_on(new_params):
updated_params = deepcopy(DEFAULT_PARAMS)
updated_params.update(new_params)DEFAULT_PARAMS = {"parse": False}
def mutability_on(new_params):
updated_params = { **DEFAULT_PARAMS }
updated_params.update(new_params)
# Python 3 en adelante@darking360
@darking360
# Cool imports
class PostObject():
def post_commit():
pass
class PostNote(PostObject): # Herencia
def post_commit():
segment_data(self.note, "created")
def handle_request():
modify_data()
self.post_commit()@darking360
# Cool imports
class PostObject():
def post_commit():
pass
class PostNote(PostObject): # Herencia
self.schema = note_schema # Composicion
def post_commit():
segment_data(self.schema.dump(self.note).data, "created")
def handle_request():
modify_data()
self.post_commit()@darking360
resultado = lambda a, b : a + bx = 2;
def add(y):
x += y;
add(4);@darking360
@darking360
Aplicaciones monolíticas
Separación de preocupaciones
Una no afecta a la otra
@darking360
@darking360
@darking360
Yo cuando la comunicación entre aplicaciones funcionó ☝️
@darking360
¿En busca de trabajo o empezando? 🙋
Pregunten M U C H O!
Conozcan el proyecto
@darking360
@darking360
@darking360
@darking360
Python Developer
Full Stack Python + React
Apploi's Dev Team ❤️
@darking360
@darking360
By Miguel Alejandro Bolivar Portilla