«Four years from now, ‘mere mortals’ Will begin to adopt an event-driven architecture (EDA) for the sort of complex event processing that has been attempted only by software gurus [until now]’
—Roy Schulte (Gartner), 2003
(Entrada actualizada en Enero 2019, al liberarse como GA el mecanismo de Change Data Capture en Winter 19).
En esta primera entrada de una serie, intento situar, cuales son los mecanismos existentes en Salesforce, cuyo core es el uso de Eventos, e intento compararlos y ubicarlos en sus casos de uso.
Podría decirse que esta es una entrada 101 en Eventos de Salesforce.
En mi experiencia, no es trivial entender los «productos/mecanismos» que ofrece y ofrecerá Salesforce sobre eventos (Streaming API, Platform Events, etc.), y las tecnologías (Kafka, Bayeaux, Long Polling, etc.) asociadas y los casos de uso a que dan respuesta.
Por ejemplo, el título de esta entrada es incorrecto, ya que debería ser algo así como: Introducción a los mecanismos de la Salesforce Enterprise Messaging Platform (pero con ese nombre …), espero pues, que el resto del artículo no sea como el título ;-).
Introducción a la Arquitectura de Eventos
No voy a extenderme mucho en las ventajas que puede suponer una arquitectura basada en eventos, frente a un patrón tradicional de integraciones.
Creo que la imagen de una «Arquitectura Spaguetti » lo describe bien:

En una Event Driven Architecture (EDA en adelante), idealmente la imagen se simplifica tal que:

En muchos casos, cada vez más (especialmente cuando aparecen numerosos receptores de un mismo mensaje – IoT por ejemplo), este tipo de Arquitectura simplifica el diseño y da respuesta a casos de uso, a los que una arquitectura tradicional no daba una solución escalable.
Las ventajas de una EDA son:
- Publicación Real-Time de los eventos en el Producer (emisor)
- Implica que deja de producirse pooling por parte de los Consumers
- Desacople entre sistemas: el emisor y el receptor no se conocen
- Incluso la cadencia de emisión y consumo son distintos (pacing)
- Se enriquece si el BUS implementa Durabilidad de los mensajes (Retención de histórico recuperable a partir de último mensaje recibido)
- Simplificación del Patrón, usando Fire&Forget
- Arquitectura altamente escalable cuando el volumen de Consumers aumenta considerablemente
Pero también tiene desventajas:
- Requiere de tecnologías no disponibles en todos los sistemas existentes
- Requiere de un mediador que permita la recepción y mediación de los eventos (y si se requieren funcionalidades avanzadas, es necesario un Event Bus cualificado)
- El número de comunicaciones entre los sistemas tiende a aumentar, especialmente si se implementa el patrón CallBack (el evento no contiene datos, solo los identificadores de los objetos de los que recuperar datos – por tanto para la recuperación se requieren invocaciones adicionales)
- El emisor no tiene garantía, ni pretende saber, que los destinatarios hayan tratado los eventos, ya que el patrón usado es Fire&Forget (no hay garantía de que todos los clientes consuman sus eventos)
- La gestión de errores se complica o no existe
- Los receptores mantienen la conexión abierta con el servidor, lo que se denomina Long Polling
El modelo de integración cambia entre ambos modelos de arquitectura, en la siguiente imagen se comparan:

Y el flujo de comunicación también, como por ejemplo mediante una conversación entre 2 sistemas con API y Streaming API:
Veamos a continuación los diferentes productos que Salesforce ha ido proporcionando.
Productos de Salesforce basados en Eventos
Los productos que actualmente podemos usar los clientes de Salesforce son:
- Streaming API
- Streaming API con Generic Streaming (diós que nombre :-))
- Platform Events
- Change Data Capture (liberado en GA en Winter 19)
Y otros como Event Monitoring, External Services Async, etc., que a corto/medio plazo incorporarán nuevas funcionalidades utilizando Eventos.

Como veremos estos productos han ido creciendo en el tiempo.
Descripción y casos de uso de cada unos de los productos
Producto | DESCRIPCIÓN y casos de uso |
---|---|
Streaming API |
|
Streaming API con Generic Streaming |
|
Platform Events |
|
Change Data Capture |
|
En los siguientes apartados se analizan los productos actualmente disponibles (desafortunadamente en el momento de escribir esta entrada no tengo acceso a Change Data Capture).
Conceptos usados en cada uno de los productos
Cada producto usa conceptos, que aunque parecidos, varian entre productos.
Producto | DESCRIPCIÓN |
---|---|
Streaming API |
|
Streaming API con Generic Streaming |
|
Platform Events (y CDC) |
|
Creación del Canal y Generación del Evento
Veamos pues, como se realizan la creación del canal y la generación del evento en cada uno de los productos:
Producto | DESCRIPCIÓN |
---|---|
Streaming API |
|
Streaming API con Generic Streaming |
|
Platform Events (y CDC) |
|
Suscripción al canal
Análogamente para la suscripción:
Producto | DESCRIPCIÓN |
---|---|
Streaming API (también Generic) |
|
Platform Events (y CDC) |
Destacar que los suscriptores APEX, se ejecutan en el proceso denominado «Automated Process«, lo que por ejemplo obliga a la creación de un Trace Log con ese usuario, para visualizarlos (existen otras implicaciones que deben comprobarse). La de-suscripción es equivalente. |
Aquí vemos un esquema resumen de Platform Events donde observamos todos los mecanismos comentados:

Características únicas de cada Producto
Cada uno de estos productos, posee ciertas características que vale la pena conocer, no se ahonda en cada una de ellas, solo trato de enumerarlas.
Versionado de Schema en Platform Events
El schema es un concepto que Salesforce introduce para identificar la versión de los metadatos del mensaje.
Así, en Platform Events, podemos modificar arbitrariamente el contenido del Objeto creado, que conformará el contenido de la estructura. Por tanto, si se modifica la definición del Platform Event, y el sistema consumidor no puede detectar que la estructura ha cambiado, puede aparecer un problema de inconsistencia de datos.
Para lidiar con esta problemática:
- El Schema está versionado y cada mensaje contiene un identificador de la versión del schema usado.
- El esquema está accesible para ser consultado vía API en los recursos siguientes:
- /vXX.X/event/eventSchema/Schema_ID
- /vXX.X/sobjects y /Platform_Event_Name__e/eventSchema
Topic Filtering
Si no deseamos recibir todos los mensajes, podemos filtrar la suscripción para recibir solo algunas de las notificaciones/mensajes en el canal establecido, filtrando la recepción durante la suscripción.
Para ello tan solo requiere la adaptación del String de suscripción: topic/ChannelName?<expression>, donde expression es fieldA=valueA&fieldB=valueB&…
Ver la lista de suscriptores en Platform Events
Platform Events permite mostrar la lista de suscriptores vía la interfaz de usuario como vía API (Triggers o Processos (sólo vía API) asociados a cada evento definido).
Ver los suscriptores se realiza mediante la interfaz de usuario, en la página de definición del evento (recuerda que en esta lista no verás los suscriptores CometD).
Message Durability
La conservación del histórico de mensajes para su Recuperación es la capacidad de un cliente para recuperar notificaciones aún disponibles en lo que se denomina la ventana de retención.
Esto permite un total desacople entre emisores y receptores, y un ritmo de generación y consumo que puede ser distinto, es decir, el emisor genera eventos y el receptor los va recibiendo y consumiendo a su ritmo.

Por cada producto de Salesforce tiene características de retención levemente distintas:
Producto | DESCRIPCIÓN |
---|---|
Streaming API (incluye Generic) |
|
Platform Events |
|
Consideraciones de Seguridad
Streaming API
- FLS se aplica tanto a los campos del SELECT como del WHERE:
- Si el nivel de acceso del cliente no permtie acceso a algunos de los campos del WHERE de la definición del Topic, el cliente no recibe esa notificación.
- Análogamente, si el nivel de acceso del cliente no permite acceso a alguno de los campos del SELECT, el cliente SI recibe la notificación, pero no recibirá ese campo informado.
- Puede restringirse el acceso sobre el Objeto utilizado en la Query.
- Puede restringirse el acceso sobre el propio PushTopic.
- Puede restringiste el acceso sobre el Push Streaming Channel.
Platform Events (y CDC)
- FLS no aplica: Todos los campos son read-only por defecto, y no es posible restringir el acceso a los campos individualmente. Dado que los campos de un evento no son visibles en la interfaz de usuario, FLS no aplica.
- La utilización de Platform Encription no aplica.
Límites
A continuación se detallan los límites según la documentación en el momento de escribir la entrada.
Streaming API
De los siguientes límites, es importante notar las restricciones sobre:
- Número máximo de Topics por Org
- Número máximo de clientes sobre un Topic

Platform Events
Para este producto existen numerosas restricciones, que aplican tanto a la definición, como a la generación de eventos, el número de clientes que consumen, etc.
Para obtener la información más actual sobre estos límites consulta esta página: Platform Event Allocations.
Limitaciones adicionales existentes
Producto | DESCRIPCIÓN |
---|---|
Streaming API |
|
Platform Events |
|
Change Data Capture |
|
Palabros que suenan alrededor de Eventos pero que despistan
Durante el aprendizaje de la arquitectura de Eventos, aparecen otros conceptos y palabrOs, que a menudo descolocan.
- Kafka: es una plataforma distribuida de eventos, originalmente construida por Linkedin y actualmente mantenida por Apache. No es necesario conocer Kafka para entender y usar la arquitectura de Eventos Salesforce, pero se menciona porque es el mecanismo que ha inspirado el diseño de Salesforce.
- Salesforce Connect: es un mecanismo basado en oData para el acceso a datos externos a Salesforce como si de objetos locales se tratara. Nada tiene que ver con la Arquitectura de Eventos de Salesforce.
- Heroku Connect: es un mecanismo de replicación continua entre Salesforce y el servicio PaaS de Heroku. Aunque ambas se comunican por mensajes y eventos, nada tiene que ver tampoco con la Arquitectura de Eventos de Salesforce, sinó que es otro de los mecanismos de integración que tiene Salesforce.
- External Services: la siguiente versión de este servicio, podría utilizar la tecnología de eventos, para proporcionar asincronía, por eso se menciona como otro de los productos que utilizará el mecanismo de eventos.
- EMP Connector: es una librería Java que implementa un cliente CometD que ha liberado Salesforce para facilitar el desarrollo sobre la plataforma y simplificar nuestro código utilizando sus funciones (enlace en la parte final del artículo).
Conclusiones
Como hemos visto la plataforma de Eventos de Salesforce ha ido evolucionando y aportando nuevos productos, donde cada uno de ellos satisface ciertos casos de uso y necesidades.
Actualmente, Platform Events y CDC (liberado en GA Winter 19) parece el más flexible, el más potente, y un paso adelante para Salesforce (aunque, aún no soporta grandes volúmenes de Eventos).
Por otro lado, algunas entradas en blogs y comentarios, demonizan la arquitectura de interfaces tradicional, pero en mi opinión será la combinación de una Arquitectura SOA + Arquitectura de Eventos permitirá abordar proyectos más complejos que los actuales con garantías de éxito en entornos empresariales con heterogeneidad de sistemas.
Mi experiencia personal en varios proyectos utilizando este mecanismo y especialmente cuando era empleado de Salesforce, y por tanto tenía que ofrecer soporte al cliente sobre esta tecnología es:
- Habitualmente es un patrón de diseño que se entiende perfectamente, se pinta muy fácilmente en PowerPoint y en la PoC básica funciona de maravilla
- Aún así, su fiabilidad en ciertos altos volúmenes puede ser comprometida.
- Investigar por qué uno de los clientes no ha recibido un evento determinado, es muy difícilmente trazable y puede existir muchas razones por las qué hayan incidencias: seguridad aplicada en la configuración de red del cliente, insuficientes recursos de tratamiento del consumidor, etc.
- En casi todos los proyectos, no se plantea como se van a reconciliar los eventos generados y los consumidos, solo se detectan errores difícilmente investigables y salta la alarma.
- El Event Bus puede tener incidencias puntuales, y por tanto los consumidores, deben explícitamente tener un mecanismo de retro-recepción de eventos (volver a recibir los eventos desde cierto instante del tiempo). A veces, este mecanismo puede no ser posible, ya que si volvemos a aplicar los mensajes (doble imputación de cargos bancarios, doble imputación de pedidos en almacenes, etc.) podemos generar inconsistencia de datos.
- Utilizar eventos para transmitir información crítica, sin mecanismos de reconciliación y sin mecanismos de retro-recepción, con volúmenes altos en mi opinión es una situación indeseable para el uso de Platform Events.
Enlaces interesantes
Para saber recomiendo estos artículos:
- 10 thoughts about Platform Events de Alba Rivas
- Introduction to Platfom Events de Pedro M. Molina
- First Impressions with Platform Events and the Salesforce Enterprise Messaging Platform de Christopher Marzilli
- Change Data Capture de mi mismo.
Guías oficiales:
Deja una respuesta