Iteración en acción: hacia la mejor tecnología de geolocalización

Gastón Haro
PeYa Tech
Published in
5 min readApr 19, 2021

En PedidosYa brindamos experiencias únicas todos los días a nuestros usuarios. Y cuando decimos que es un negocio de números grandes, un negocio de escalas, es en serio: en diciembre de 2020 entregamos millones de pedidos a personas de toda latinoamérica. Todos los días conectamos a nuestros usuarios con los productos que necesitan, trabajando junto a todo un ecosistema: repartidores, comercios asociados y ¡los propios equipos de PedidosYa que trabajamos todos los días para lograrlo!

Las posibles áreas para las cuales un local puede entregar un pedido (las denominamos “zonas de entrega”) así como las condiciones del mismo (tiempo y costo), varían mucho de acuerdo a múltiples factores (disponibilidad de repartidores, tiempo de preparación de los pedidos, clima y cantidad de pedidos, entre otros). Poder determinar estas condiciones para cada combinación posible de Restaurant, Repartidor y Usuario de forma precisa y rápida es clave para lograr una gran experiencia de usuario.

Esquema de zonas de entrega para un comercio asociado

Hasta 2020 en PedidosYa contábamos con una solución implementada sobre Elasticsearch utilizando Geo Shape Query DSL [1]: una alternativa práctica, robusta que fuimos optimizando y nos permitió crecer. Sin embargo no fue un camino fácil. La continua expansión de PedidosYa nos obliga a trabajar cada día para mantener la más alta calidad de servicio bajo demandas crecientes tanto de volumen de datos como de usuarios y transacciones. Algunas de las dificultades que enfrentamos con esta solución incluían:

  • Escalado dinámico
  • Competencia por recursos de hardware entre tareas de indexación y consulta
  • Costos
  • Control y monitoreo directo de la infraestructura
  • Gran trabajo operativo
  • Disponibilidad de la solución

Debido a éstos, decidimos evaluar otras tecnologías posibles que nos ayudaran a resolver nuestro caso de uso: identificar las posibles zonas de entrega de cada local dada la ubicación de cada usuario y que a su vez nos permitieran acompañar el crecimiento exponencial de nuestro negocio.

Las tecnologías que evaluamos incluyeron:

  • S2 Geometry [2]: una biblioteca desarrollada por Google disponible en una gama de lenguajes (C++ referencia, Golang, Python y Java) para geometría esférica que tiene como objetivo tener la misma robustez, flexibilidad y rendimiento que las mejores bibliotecas de geometría plana.
  • Apache Lucene [3]: una biblioteca de motor de búsqueda con muchas funciones full-text-search y de alto rendimiento. Está escrita íntegramente en Java (aunque existen alternativas para utilizarla desde otros lenguajes e.g. PyLucene desde Python) y dentro de dichas funciones incluye búsqueda geoespacial. (*)

* Apache Solr y Elasticsearch son los motores de búsqueda de código abierto más populares basados en Lucene.

Realizamos pruebas de concepto utilizando ambas tecnologías: Apache Lucene (Java) y S2 (Golang), siempre con el objetivo de plantear soluciones escalables, confiables, precisas y performantes. Las mismas fueron realizadas con el objetivo de comparar performance, precisión de los resultados y requerimientos de hardware que nos asegurasen alcanzar los tiempos de respuesta esperados (~10 a 25 ms). En ciudades como Buenos Aires (Argentina) o Santiago (Chile) la cantidad de zonas de entrega que alcanzan una posición particular puede ascender a varios miles.

En las pruebas encontramos que nuestra implementación, utilizando la biblioteca S2 Geometry, nos otorgaba una performance 5x mejor en tiempos de respuesta que la comparativa con Apache Lucene. A continuación los gráficos que lo evidencian:

Tiempos de búsqueda para la implementación con Apache Lucene: 70ms avg.
Tiempos de búsqueda para la implementación con S2 Geometry: 14ms avg.

Las comparativas con nuestra solución anterior sobre Elasticsearch fueron lo que esperábamos y provienen mayormente de pasar a un esquema 100% in-memory donde cada zona de entrega es indexada en un índice inverso con granularidad dinámica el que se utiliza como un primer filtro a la hora de determinar si una ubicación en particular está o no contenida por cada una de las zonas de entrega. Los datos se refrescan en segundo plano y las tareas de ingestión no compiten por recursos con la tarea fundamental del servicio.

Como S2 Geometry indexa una zona de entrega

Implantar el servicio implicó adecuar nuestro pipeline de ingestión de zonas de entrega a esta nueva arquitectura: se reciben miles de modificaciones por minuto que deben reflejarse en la aplicación inmediatamente. Generar junto al equipo de infraestructura un entorno de CI/CD que nos permitiese poner en producción nuevas versiones del servicio de forma práctica y segura además de generar la infraestructura de ejecución y almacenamiento de datos que asegurase el nivel de servicio que debíamos atender y permitiese atender la creciente demanda de forma desatendida.

El camino nos tomó algunos meses hasta que la transición estuvo completada, incluso debimos involucrar a otros equipos de PeYa: principalmente a quienes trabajan desde el lado de la infraestructura, como mencionamos anteriormente, para asegurar la robustez y calidad del servicio. Además, debimos realizar una migración de nuestra base de datos de zonas de entrega al nuevo sistema con nuevo formato, adecuación de nuestros clientes a la nueva interfaz del servicio y sistemas de alarmas y monitoreo. ¡Toda una hazaña de nuestro gran equipo!

En retrospectiva pudimos ver que realmente estábamos atados a una solución que no era ideal. Los fallos por degradación de la performance de Elasticsearch en momentos de alto tráfico se volvían cada vez más frecuentes y generaban un impacto negativo en el negocio. La solución sobre S2 Geometry nos brindó robustez, nos permitió asegurar la calidad de servicio y tener control sobre la totalidad de la infraestructura, pudiendo responder con velocidad en caso de presentarse fallos. Este gran trabajo fue el resultado de una colaboración internacional e interna al mismo tiempo. Y fue posible gracias al trabajo, el apoyo y el reconocimiento de que este proyecto era de vital importancia para la proyección de PedidosYa hacia adelante: si no hubiéramos tenido la oportunidad de avanzar, iterar, aprender y equivocarnos, quizá nunca hubiéramos realizado tal tarea. Pero como decimos en PeYa: mejor intentar, y equivocarse, ¡que nunca haberlo intentado! Y este, definitivamente fue el mejor ejemplo. Desde la puesta en marcha de la nueva solución a fines de 2020 ¡PedidosYa sumó presencia en 5 nuevos países! Gracias a que contamos con una solución escalable y flexible, tenemos la seguridad necesaria para continuar nuestro crecimiento. ¡Y, como decimos siempre, vamos por más!

--

--