63
Nuestra API Daniel Rabinovich CTO - MercadoLibre @drabinovich

Daniel rabinovich php conference

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Daniel rabinovich   php conference

Nuestra APIDaniel RabinovichCTO - MercadoLibre@drabinovich

Page 2: Daniel rabinovich   php conference

Agenda

Quiénes somos

Nuestra API

Page 3: Daniel rabinovich   php conference

MercadoLibre

#1 sitio de e-commerce más grande del LatAm

#8 sitio de e-commerce más grande del mundo

90MM usuarios registrados

23MM usuarios activos (operaron en 2012)

5,7BN de dólares transaccionados (2012)

275% de crecimiento desde el IPO (2007)

Page 4: Daniel rabinovich   php conference

Un poco de "scalability porn”

7Gbps de tráfico

1,4 BN de hits al día en el front-end 7,2 BN de hits al día en la API

1800 búsquedas por segundo

95 bases de datos

930TB de data en bases de datos

120TB de fotos

Page 5: Daniel rabinovich   php conference

Un ecosistema de ecosistemas

MercadoPago

Publicidad

MercadoEnvios

MercadoShops

Page 6: Daniel rabinovich   php conference

Agenda

Quiénes somos

Nuestra API

Contexto

Diseño

Monetización

Page 7: Daniel rabinovich   php conference

Monolítico -> DesacopladoNacimos monolíticos, desacoplamos (justo) a tiempo

Flexibilidad

Escalabilidad

Apertura

Control

Performance

Monolítico Desacoplado

Page 8: Daniel rabinovich   php conference

Monolitos -> presión crecienteCambios en el entorno exigen flexibilidades para las que no están preparadas

Monolítico

Escalar el equipo

Múltiples "pantallas"

Velocidad de desarrollo

Abrir la plataforma

Page 9: Daniel rabinovich   php conference

Qué no hicimosLas APIs como “backdoors” nacen condenadas a muerte

Developers

APIs

Usuarios

Page 10: Daniel rabinovich   php conference

Comemos el pescado que vendemos

Front-end Mobile Back-end

Una única API

Developers

Compartimos exactamente la misma API que usamos para nuestros front-ends

Page 11: Daniel rabinovich   php conference

Una API es una necesidad interna, antes que una externa

Page 12: Daniel rabinovich   php conference

Partimos MercadoLibre en 100 “celdas”

Code

Infrastructure Data

Team

Facebook

Search

View Item Paage

Listings

Users

Orders

Cada “celda” funciona como si fuese una empresa independiente

Page 13: Daniel rabinovich   php conference

Posponer soluciones!=

No prever soluciones

Page 14: Daniel rabinovich   php conference

"The bright side of being late is that (if you're still alive) you

can leapfrog"

Page 15: Daniel rabinovich   php conference

Agenda

Quiénes somos

Nuestra API

Contexto

Diseño

Monetización

Page 16: Daniel rabinovich   php conference

REST sobre HTTPEl mundo descripto en términos de “recursos”

/sites/MLA

/users/4605484

/items/MLA473364655

/pictures/MLA3004267263_082012

Page 17: Daniel rabinovich   php conference

Sólo verbos estándar HTTPMinimizan la necesidad de leer documentación

Obtener Crear Modificar Borrar

Page 18: Daniel rabinovich   php conference

Verbos STD evitan DOCsEn SOAP podría ser “updateUser”, “alterUser”, etc. Sobre REST no hay duda!

PUT /users/4605484{

last_name: “Fagúndez”

}

Page 19: Daniel rabinovich   php conference

Una API no sólo es una interfaz para computadoras.

Page 20: Daniel rabinovich   php conference

Repasamos conceptos de UsabilidadPueden aplicarse directamente a los usuarios de una API

Learnability

Efficiency

Satisfaction

Page 21: Daniel rabinovich   php conference

Pretty Print: la vista para el DeveloperLa API detecta cuando se navega desde un browser, y se “autodocumenta”

Para máquinas Para humanos

Page 22: Daniel rabinovich   php conference

Pretty Print: recursos relacionadosLos IDs se transforman en links en la vista “para humanos”

Page 23: Daniel rabinovich   php conference

Introspection: la API se autoexplicaLa API genera su propia metadata a través del verbo STD "OPTIONS"

OPTIONS /sites

Page 24: Daniel rabinovich   php conference

Usabilidad orientada al programadorLas convenciones son el activo oculto más importante de una API

• “AR” vs “0001” (ISO codes sobre códigos “inventados”)

• “seller_id” vs “customer_id” (reduce ambigüedad)

• “condition: used” vs“used:true” (escalable, evita cambios de firma ante nuevos valores)

• Diseñar para el caso canónico (Desnormalizar inteligentemente, evita requests innecesarios)

Page 25: Daniel rabinovich   php conference

Diseñar para el caso canónicoEj: el GET /items tiene como caso canónico mostrar la página de producto

GET /items/MLA472660878

Page 26: Daniel rabinovich   php conference

Caso canónico justifica desnormalizarLa API de un artículo resuelve la URL de la foto para evitar el request adicional

/items/MLA472660878

Page 27: Daniel rabinovich   php conference

El problema “N+1”Típico en front-ends de listados: 1 request para los IDs + uno por cada producto

Sergún REST “Kosher”

20 filas = 21 requests

• 1 para los IDs• 20 requests para

las descripciones

Page 28: Daniel rabinovich   php conference

SelectionLa capacidad de pedir menos atributos que los dflt del recurso

/items/MLA121484389?attributes=title

{ title: "Boomerang Artesanales De Alta Calidad}

2K

340b -> -84%

Page 29: Daniel rabinovich   php conference

N+1 -> Selection + MultigetMultiget: la capacidad de obtener N recursos en un solo API call

/items?ids=MLA121484389,MLA125002468&attributes=title

[-{

title: "Boomerang De Diseño Australiano Con Retorno" }-{

title: "Boomerang Artesanales De Alta Calidad" }

]

Page 30: Daniel rabinovich   php conference

"There is no free Lunch"

Selection y Multigetson violaciones a REST

con costos ocultos

Difícil de “cachear” y “shardear”

Page 31: Daniel rabinovich   php conference
Page 32: Daniel rabinovich   php conference

Amigarse con la inconsistenciaPrerrequisito básico para poder escalar horizontalmente

• Brewster’s CAP Theorem (Consitency, Availability, Partition Tolerance; pick 2)

• El trade-off en realidad es A vs C.

• En el 99% de los casos, elegimos A+P

• Las propiedades A[C]ID no deben ser defaults

• Consistencia -> Inconsistencia eventual

Page 33: Daniel rabinovich   php conference

El verbo SEARCH: reglas de convivenciaRecursos base: CRUD + push para que otros armen índices

SearchListings

Push notifications

Recursos base(sólo CRUD)

Consultascomplejas

Page 34: Daniel rabinovich   php conference

Un ejemplo simplePara buscar por "apodo" habría que crear un índice en el recurso USERS

/users/search?nickname=LEWIS_CARROLL

Page 35: Daniel rabinovich   php conference

Balancear requests a la “celda” correctaCada celda es responsable de generar sus propias reglas de balanceo

Users SearchUsers

/users/search?nickname=LEWIS_CARROLL/users/4605484

Page 36: Daniel rabinovich   php conference

El usuario debe percibiruna sola API

Page 37: Daniel rabinovich   php conference

Estandarización del paginadoOFFSET y LIMIT mejor que PAGE=N, permite controlar el tamaño de la página

/sites/MLA/search?q=boomerang&limit=2&offset=10

Page 38: Daniel rabinovich   php conference

Caching es diseño, no optimizaciónLas estrategias de cacheo pueden alterar el diseño

• Validation: Consistente, pero con penalties de performance 2 HTTP Headers: Etag (If-None-Match) y Last-Modified (If-Modified-Since)

• Expiration: Mucho más rápido, pero eventualmente inconsistente HTTP Header: Cache-Control: max-age=X, public

Page 39: Daniel rabinovich   php conference

Autenticación y autorizaciónSon dos conceptos muy diferentes

Autenticación:Confirmar la identidad del usuario

a través de ciertas credenciales (ej: pwd)Administrada por Plug-Ins centralizados

Autorización:Confirmar si un usuario puede ejecutar

una acción (ej: modificar un artículo)Administrara por el desarrollador (con defaults)

Page 40: Daniel rabinovich   php conference

AutenticaciónOAuth 2.0 permite que aplicaciones

3 actores:• MercadoLibre• Usuario• Aplicación

OAuth permite que aplicacionesejecuten acciones en nombrede usuarios sin acceder a suscredenciales (pwd)

Page 41: Daniel rabinovich   php conference

Recursos públicosSon visibles para todos los actores del sistema

GET /users/46054484

Page 42: Daniel rabinovich   php conference

Recursos privadosSon accesibles sólo para sus dueños. OAuth les provee un ACCESS_TOKEN

GET /users/me?access_token=ABC

Page 43: Daniel rabinovich   php conference

El usuario “autoriza” las appsA operar en su nombre. El app no obtiene acceso a sus credenciales.

Page 44: Daniel rabinovich   php conference

Las reglas de negocio son parte de la APIEs una excelente manera de no duplicar lógica

Por ejemplo, las reglas de pricing son consumidas desdeel flujo de venta y desde el back-end de atención al cliente

Page 45: Daniel rabinovich   php conference

Lockeos y HTTPUn mecanismo elegante dentro del protocolo, para hacer optimistic locking

Una manera de aplicar optimistic locking usando HTTP

- GET /users/123- Etag = ABC

- PUT /users/123 - If-match: ABC

(Aplicar si nadie modificó el objeto)

Page 46: Daniel rabinovich   php conference

Atómico y StatelessIndependientemente de la cantidad de pasos que tengan los front-ends

UserSYI

FrontEndItemsAPI

Select Category

Item Details

Listing Types

Confirmation

POST Item

Responsabilidad

del FrontEnd

Request

atómico

Page 47: Daniel rabinovich   php conference

HTTP return codes -> Parte de la APICuanto más estándares usemos, más gente sabrá usar la API sin leer la DOC

201: Object Created206: Partially created (ej: completar el pago para crear una orden)

401: Unauthorized404: Not found410: Gone

500: Internal Server Error501: Not implemented

Page 48: Daniel rabinovich   php conference

Push NotificationsClientes externos pueden suscribirse a "Topics"

Page 49: Daniel rabinovich   php conference

VersionamientoLa API debe cambiar a distintas velocidades según el tipo de app que soporta

Page 50: Daniel rabinovich   php conference

VersionamientoLa API debe cambiar a distintas velocidades según el tipo de app que soporta

api.mercadolibre.com v1.api.mercadolibre.com

Fuente: Darío Simonassi

Page 51: Daniel rabinovich   php conference

ComunidadEl "churn" de developers es enorme sin una comunidad fuerte detrás

developers.mercadolibre.com

github.com/mercadolibre(js-sdk, java-sdk, net-sdk, php-sdk)

@melidevelopers

#[email protected]

Page 52: Daniel rabinovich   php conference

SDKsProveen un buen rest client y los flujos de OAuth

Page 53: Daniel rabinovich   php conference

Agenda

Quiénes somos

Nuestra API

Contexto

Diseño

Monetización

Page 54: Daniel rabinovich   php conference

TML-YLGDE

Fuente: Fede Procaccini

Page 55: Daniel rabinovich   php conference

Esquemas de monetización

Compradores17MM (2012)

Vendedores6MM (2012)

150K profesionales

Revenue Share(compartimos la

comisión por venta)

Aplicacionesque produzcan

mejoras operativas

Page 56: Daniel rabinovich   php conference

El nicho: servicios a vendedoresGestores de ventas, inventario, logística, integradores con ERPs, CRMs, etc

Page 57: Daniel rabinovich   php conference

La API está tomando tracciónRetailers, Integradores, Gestores de Ventas y ERPs están usando la API

Page 58: Daniel rabinovich   php conference

Algunos númerosEl segmento más activo son aplicaciones para vendedores

33K apps activas

2,6MM usuarios aceptaron al menos 1 app

50% de top sellers aceptaron al menos 1 app

Se hacen a través de la API:

• 3% del total de compras móviles

• 7% del total de publicaciones

• 19% de los updates a listings

Page 59: Daniel rabinovich   php conference

Pero.. faltaba un eslabónQué pasa cuando un startup no tiene dinero para empezar?

APIexitosa

Tecnología

Monetización

Comunidad

Financiamiento

Page 60: Daniel rabinovich   php conference

Creamos un fondo de US$ 10MMPara invertir en startups que mejoren el ecosistema de MercadoLibre

Ya hicimos las primeras 3 inversiones de US$ 100.000 c/u:

• Mr Presta: Microloans. Scoring basado en historial de ventas

• Nubi Metrics: Business Intelligence para vendedores

• Parsimotion: cloud based ERP orientado a supply-chain

Page 61: Daniel rabinovich   php conference

Agenda

Quiénes somos

Nuestra API

Recapitulando…

Page 62: Daniel rabinovich   php conference

Recapitulando…

• La API es primero una necesidad interna.

• No es sólo una interfaz para computadoras.

• Desnormalizar inteligentemente.

• Amigarse con la inconsistencia.

• Posponer soluciones != no preverlas.

• El usuario debe percibir una sola API.

• Pensar en monetización desde el día 0.

Page 63: Daniel rabinovich   php conference

Gracias!@drabinovich