Notificaciones Push: No se puede vivir con ellas, no se puede vivir sin ellas

Rate this content
Bookmark

Considera cuántas notificaciones recibes al día... y ahora considera los millones de personas que también reciben notificaciones. 16 millones de notificaciones al día que tienen lugares a los que ir y personas que ver, en una carrera contra el tiempo, la carga y la latencia.

Entonces, ¿qué sucede detrás de escena para asegurarse de que todas esas notificaciones lleguen a donde deben ir y rápidamente? Una combinación de autoescalado, rabbitMQ, monitoreo minucioso y un equipo de desarrollo incansable. En esta charla, discutiré la funcionalidad del bus de mensajes en el núcleo de la plataforma de comunicaciones de Vonage, los poderosos scripts de Node que impulsan toda la operación y cómo puedes utilizar soluciones similares para diversos desafíos.

9 min
24 Jun, 2021

Video Summary and Transcription

La charla explora el recorrido de una notificación en una plataforma de comunicaciones, destacando los desafíos de la ingeniería de infraestructura. Los IDs de trazabilidad y el almacenamiento local desempeñan un papel crucial en garantizar la llegada de las notificaciones, lo que permite una fácil depuración si no llegan al dispositivo. Los registros demuestran el recorrido de una notificación, llegando a la tienda de aplicaciones en solo 4 milisegundos.

Available in English

1. The Journey of a Notification

Short description:

Cuando era niño, me encantaba un libro infantil sobre un piojo que viaja por el mundo y encuentra su pareja perfecta. Esta historia me recordó el viaje de una notificación en nuestra plataforma de comunicaciones, que debe llegar en milisegundos. Vamos a explorar los desafíos de la ingeniería de infraestructura y los pasos involucrados en la entrega de notificaciones a diferentes dispositivos, incluyendo aplicaciones de escritorio y móviles.

Cuando era niño en Estados Unidos, de padres israelíes, la mayoría de mis libros y películas desde muy temprana edad eran en hebreo, por supuesto, para enseñarme el idioma antes de que el inglés se apoderara de mi cerebro.

Una cinta que me encantaba se llamaba Hakina Nekhama, Nekhama el Piojo, que si no estás familiarizado con esta palabra, es la versión singular de piojos. Asqueroso, lo sé.

La historia contaba de este piojo que decidió que no quería quedarse en una cabeza para siempre. Quería salir y viajar por el mundo, ver diferentes cabezas y diferentes ciudades. Pero obviamente todos la odiaban y querían que se fuera, y ella viajaba incansablemente de una cabeza a otra hasta que accidentalmente aterriza en la cabeza de un hombre calvo, quien en realidad está muy emocionado de tenerla porque ahora tiene el mismo problema que las personas con cabello. Se hacen amigos y viven felices para siempre.

Ahora, obviamente esta es una historia ridícula, pero cuando me uní a Vonage el año pasado y aprendí sobre nuestra plataforma de comunicaciones y la cantidad de mensajes que maneja al día, consideré la notificación única entre un millón que se abre camino en un viaje rápido de 5, 10, solo milisegundos llegando a donde necesita estar, de repente me hizo pensar en ese pequeño piojo rosa que amaba de niño, uno entre un millón, que con propósito y ambición finalmente llegó a la cabeza del hombre calvo que la quería, su pareja perfecta, precisamente donde necesitaba estar. ¿Milagroso, no?

Pero aquí está la cosa, en el mundo de los libros infantiles, todo termina felizmente, pero en la vida real, las cosas no salen como se planean, los objetos se pierden, las notificaciones nunca llegan a su destino, así que hablemos de esta vida real de la ingeniería de infraestructura, de rastrear nuestros pasos y asegurarnos de saber qué está sucediendo en cada punto del peligroso viaje.

La plataforma de Comunicaciones Empresariales de Vonage, el sistema del que hablaré hoy, ofrece capacidades de voz, mensajería, video y correo de voz tanto en escritorio como en dispositivos móviles. La plataforma cuenta con 150,000 usuarios que a través de todas estas funcionalidades producen 800 notificaciones por segundo. ¿Y lo mejor? Todas esas notificaciones llegan a donde necesitan estar en 15 milisegundos, porque ese es el tipo de estándares a los que estamos acostumbrados hoy en día. Entonces, ¿cómo es este viaje de 15 milisegundos de una linda notificación? Comencemos desde el principio.

Digamos que estás en tu computadora usando la aplicación de escritorio. Tu computadora, a través del cliente, se conecta a la infraestructura de mensajería que llamamos la estación de autobuses y se presenta, `Hola, pertenezco a la computadora de Juan. Me gustaría registrarme para recibir notificaciones`. La estación de autobuses envía una solicitud a su API, que hemos llamado Frizzle porque las referencias a los libros infantiles nunca terminan, para informarle sobre la nueva conexión. Toda la información de identificación se almacena. Frizzle se comunica con el intermediario de mensajes, que crea una nueva cola para tu usuario en particular y, con la ayuda del protocolo de mensajes, determina en qué cola colocar tus mensajes. El protocolo devuelve una URL y así se forma una conexión WebSocket entre tu cliente y esta cosa que llamamos el autobús. Ahora, en el otro extremo, se envía un mensaje hacia ti. Llega a la API de Frizzle perteneciente al autobús, y Frizzle envía la notificación a RabbitMQ, y el Protocolo de Mensajes la envía a tu dispositivo. Genial.

Pero te preguntas ahora, ¿qué pasa con los teléfonos móviles? ¿La aplicación móvil? No puedo mantener una conexión WebSocket con el teléfono todo el tiempo, ¿verdad? Entonces, ¿qué pasa con esas famosas notificaciones push del título de mi charla? Y lo que es más importante, ¿cómo sigo el progreso de esas notificaciones? Porque con 800 notificaciones por segundo, puede ser muy fácil perder rápidamente el rastro. Bueno, cuando abres la aplicación móvil, ocurre un flujo similar. Tu teléfono se conecta a la estación de autobuses y se presenta con tu ID e información sobre tu dispositivo y algo llamado un token de notificación, asumiendo que hiciste clic en Permitir Notificaciones en la aplicación. La API maneja y almacena esta información, y ahora estás registrado para recibir notificaciones. Ahora, cuando Frizzle envía la notificación a tu cola, esa notificación también se envía en paralelo a lo que llamamos el servicio HTTP del autobús. Escrito en Node, el servicio sabe si te has registrado para recibir notificaciones push.

2. The Role of Trace IDs and Local Storage

Short description:

Si tienes una notificación y quieres garantizar su llegada, los IDs de rastreo en los registros juegan un papel crucial. Al utilizar un paquete de almacenamiento local de continuación o un gancho CLS, puedes guardar el ID de rastreo en el almacenamiento local, lo que lo hace accesible para cualquier registro o solicitud en cualquier punto del flujo. En el servicio HTTP, el middleware obtiene el ID de rastreo de las cabeceras y lo agrega al almacenamiento local de la sesión. Luego, el ID de rastreo se incluye en los registros y las solicitudes, asegurando que el registrador no necesite conocerlo. Finalmente, cuando la notificación se envía a PushMe, el ID de rastreo se rastrea en las cabeceras, lo que permite una fácil depuración si la notificación no llega al dispositivo. Estos registros demuestran el viaje de una notificación, llegando a la tienda de aplicaciones en solo 4 milisegundos.

Si tienes, la notificación y tu información se envía a PushMe, otro servicio de Node para notificaciones push. Este servicio tiene una base de datos de esos tokens de push mapeados a cada usuario, que le indican a qué sistema operativo y a qué dispositivo enviar esa notificación push. Ahora, con una infraestructura en su lugar, ¿cómo podemos garantizar la llegada de 16 millones de notificaciones diarias? La respuesta obvia son los IDs de rastreo en los registros, asegurando que el mismo ID siempre se use para la notificación específica en cada servicio, ¿verdad? Pero, ¿cómo lo hacemos mientras separamos la lógica empresarial de la infraestructura? No queremos que un ID de rastreo aparezca por todo nuestro código, ¿verdad? Aquí es donde entra en juego un práctico paquete de NPM.

Y esta parte es importante incluso si no estás tratando de construir una plataforma de comunicaciones masiva. Estoy hablando de un paquete de almacenamiento local de continuación o gancho CLS que utiliza ganchos asíncronos para mantener algo como un almacenamiento local para cada sesión de solicitud. Si ya estás utilizando Node 14, sin embargo, esta funcionalidad está incorporada con una API nativa experimental. Permite que el ID de rastreo se guarde en el almacenamiento local para que se pueda recuperar para cualquier registro y cualquier solicitud en cualquier punto del flujo.

Entonces, consideremos esta parte del diagrama. Imagina una notificación push dirigida a tu teléfono que te dice que recibiste un mensaje de Jonathan. Como sabemos, Frizzle envía esta notificación como una solicitud al servicio HTTP del autobús. Al llegar al servicio HTTP, el middleware obtiene el ID de rastreo de las cabeceras y lo coloca en el almacenamiento local de la sesión. Se escriben varios registros a medida que ocurren diferentes cosas, como verificar un rifle, por ejemplo, y encontrar información sobre el dispositivo del usuario. Y luego, cada vez, ese ID de rastreo se agrega a esos registros antes de que se escriban. Suponiendo que aceptes notificaciones push, el intérprete captura la notificación justo antes de que se dirija a PushMe y rastrea el ID de rastreo en las cabeceras de la solicitud. Lo genial es que CLSHooked se puede usar para otras cosas, no solo registros, como en una situación en la que necesitas los detalles del usuario en cada paso a lo largo del flujo de tu servicio. Pero veamos cómo se ve en nuestro código, que se ha tomado del servicio HTTP. Primero creamos una instancia del middleware de esta manera, y luego la recuperamos de esta manera. Entonces, cuando una solicitud llega al servicio y es interceptada por el middleware de rastreo, que verifica si tiene un ID de rastreo, asumiendo que llegó de Frizzle, debería, luego guarda ese ID en la instancia de almacenamiento local. Y en este punto estamos manejando la lógica empresarial, ¿verdad? Estamos verificando si debemos enviarle a este tipo una notificación push. En cada punto del camino donde se debe escribir un registro y antes de que se envíe, será capturado por el middleware aquí, que agregará el ID de rastreo tomando del almacenamiento local y luego escribirá el registro. Ahora el mismo intérprete se encuentra en Axios, el cliente HTTP, para que cada vez que una solicitud esté a punto de ir a otro servicio, capturemos esa solicitud HTTP justo antes y agreguemos el ID de rastreo a su cabecera. Y todo esto asegura que el registrador no necesite saber nada sobre el ID de rastreo. Genial, ¿verdad? Cuando PushMe finalmente envía esa notificación a tu dispositivo, tendremos ese registro final con el ID de rastreo en cuestión y sabremos que enviamos esa notificación a la tienda de aplicaciones. De esta manera, si se envió una notificación a tu teléfono y no la recibiste, podemos culpar a Apple, ¿porque no nos encanta culpar a Apple? Y esto es cómo se ven una serie de registros para una notificación de una llamada entrante. Si observas las marcas de tiempo, notarás que va desde Frizzle hasta el servicio HTTP hasta PushMe en cuestión de 4 milisegundos. Entonces, este puede no ser el viaje heroico de un lindo parásito alrededor del mundo, pero, hey, quién sabe, estos podrían ser los registros de una pequeña notificación que llegó alrededor del mundo en menos de 15 milisegundos. Gracias.

Check out more articles and videos

We constantly think of articles and videos that might spark Git people interest / skill us up or help building a stellar career

Node Congress 2022Node Congress 2022
26 min
It's a Jungle Out There: What's Really Going on Inside Your Node_Modules Folder
Top Content
Do you know what’s really going on in your node_modules folder? Software supply chain attacks have exploded over the past 12 months and they’re only accelerating in 2022 and beyond. We’ll dive into examples of recent supply chain attacks and what concrete steps you can take to protect your team from this emerging threat.
You can check the slides for Feross' talk here.
Node Congress 2022Node Congress 2022
34 min
Out of the Box Node.js Diagnostics
In the early years of Node.js, diagnostics and debugging were considerable pain points. Modern versions of Node have improved considerably in these areas. Features like async stack traces, heap snapshots, and CPU profiling no longer require third party modules or modifications to application source code. This talk explores the various diagnostic features that have recently been built into Node.
You can check the slides for Colin's talk here. 
JSNation 2023JSNation 2023
22 min
ESM Loaders: Enhancing Module Loading in Node.js
Native ESM support for Node.js was a chance for the Node.js project to release official support for enhancing the module loading experience, to enable use cases such as on the fly transpilation, module stubbing, support for loading modules from HTTP, and monitoring.
While CommonJS has support for all this, it was never officially supported and was done by hacking into the Node.js runtime code. ESM has fixed all this. We will look at the architecture of ESM loading in Node.js, and discuss the loader API that supports enhancing it. We will also look into advanced features such as loader chaining and off thread execution.
JSNation Live 2021JSNation Live 2021
19 min
Multithreaded Logging with Pino
Top Content
Almost every developer thinks that adding one more log line would not decrease the performance of their server... until logging becomes the biggest bottleneck for their systems! We created one of the fastest JSON loggers for Node.js: pino. One of our key decisions was to remove all "transport" to another process (or infrastructure): it reduced both CPU and memory consumption, removing any bottleneck from logging. However, this created friction and lowered the developer experience of using Pino and in-process transports is the most asked feature our user.In the upcoming version 7, we will solve this problem and increase throughput at the same time: we are introducing pino.transport() to start a worker thread that you can use to transfer your logs safely to other destinations, without sacrificing neither performance nor the developer experience.

Workshops on related topic

Node Congress 2023Node Congress 2023
109 min
Node.js Masterclass
Workshop
Have you ever struggled with designing and structuring your Node.js applications? Building applications that are well organised, testable and extendable is not always easy. It can often turn out to be a lot more complicated than you expect it to be. In this live event Matteo will show you how he builds Node.js applications from scratch. You’ll learn how he approaches application design, and the philosophies that he applies to create modular, maintainable and effective applications.

Level: intermediate
Node Congress 2023Node Congress 2023
63 min
0 to Auth in an Hour Using NodeJS SDK
WorkshopFree
Passwordless authentication may seem complex, but it is simple to add it to any app using the right tool.
We will enhance a full-stack JS application (Node.JS backend + React frontend) to authenticate users with OAuth (social login) and One Time Passwords (email), including:- User authentication - Managing user interactions, returning session / refresh JWTs- Session management and validation - Storing the session for subsequent client requests, validating / refreshing sessions
At the end of the workshop, we will also touch on another approach to code authentication using frontend Descope Flows (drag-and-drop workflows), while keeping only session validation in the backend. With this, we will also show how easy it is to enable biometrics and other passwordless authentication methods.
Table of contents- A quick intro to core authentication concepts- Coding- Why passwordless matters
Prerequisites- IDE for your choice- Node 18 or higher
JSNation 2023JSNation 2023
104 min
Build and Deploy a Backend With Fastify & Platformatic
WorkshopFree
Platformatic allows you to rapidly develop GraphQL and REST APIs with minimal effort. The best part is that it also allows you to unleash the full potential of Node.js and Fastify whenever you need to. You can fully customise a Platformatic application by writing your own additional features and plugins. In the workshop, we’ll cover both our Open Source modules and our Cloud offering:- Platformatic OSS (open-source software) — Tools and libraries for rapidly building robust applications with Node.js (https://oss.platformatic.dev/).- Platformatic Cloud (currently in beta) — Our hosting platform that includes features such as preview apps, built-in metrics and integration with your Git flow (https://platformatic.dev/). 
In this workshop you'll learn how to develop APIs with Fastify and deploy them to the Platformatic Cloud.
JSNation Live 2021JSNation Live 2021
156 min
Building a Hyper Fast Web Server with Deno
WorkshopFree
Deno 1.9 introduced a new web server API that takes advantage of Hyper, a fast and correct HTTP implementation for Rust. Using this API instead of the std/http implementation increases performance and provides support for HTTP2. In this workshop, learn how to create a web server utilizing Hyper under the hood and boost the performance for your web apps.
React Summit 2022React Summit 2022
164 min
GraphQL - From Zero to Hero in 3 hours
Workshop
How to build a fullstack GraphQL application (Postgres + NestJs + React) in the shortest time possible.
All beginnings are hard. Even harder than choosing the technology is often developing a suitable architecture. Especially when it comes to GraphQL.
In this workshop, you will get a variety of best practices that you would normally have to work through over a number of projects - all in just three hours.
If you've always wanted to participate in a hackathon to get something up and running in the shortest amount of time - then take an active part in this workshop, and participate in the thought processes of the trainer.
TestJS Summit 2023TestJS Summit 2023
78 min
Mastering Node.js Test Runner
Workshop
Node.js test runner is modern, fast, and doesn't require additional libraries, but understanding and using it well can be tricky. You will learn how to use Node.js test runner to its full potential. We'll show you how it compares to other tools, how to set it up, and how to run your tests effectively. During the workshop, we'll do exercises to help you get comfortable with filtering, using native assertions, running tests in parallel, using CLI, and more. We'll also talk about working with TypeScript, making custom reports, and code coverage.