Suscripciones de GraphQL con Debezium y Kafka

Rate this content
Bookmark
Reaccionar a los cambios de datos y publicar esos cambios como eventos de GraphQL con suscripciones puede ser difícil, especialmente en un entorno de múltiples servicios con múltiples bases de datos o al escalar su servidor de GraphQL con múltiples instancias. Los clientes de GraphQL no deben perder eventos ni recibirlos dos veces, sin importar cómo sea su arquitectura backend o qué problemas (caída del servicio, pérdida de conexión a la base de datos, ...) puedan tener al atender una solicitud de suscripción.

En esta charla, te mostraré cómo Debezium y Apache Kafka pueden ayudarte a construir suscripciones confiables a partir de cambios en tu base de datos. Debezium es una herramienta de captura de datos de cambio (CDC) que puede enviar cambios desde el registro de transacciones de una base de datos al broker de mensajes Kafka.

En mi charla, utilizaré un backend de GraphQL implementado en Java con "Spring for GraphQL", pero como Debezium y Kafka no están limitados a Java, la idea también es utilizable con otros frameworks y lenguajes de programación de GraphQL. No es necesario tener conocimientos de Java o Spring for GraphQL para entender la charla.

7 min
08 Dec, 2022

Video Summary and Transcription

Esta charla relámpago explora el uso de suscripciones de GraphQL con Kafka y Debezium. Al agregar un broker de mensajes como Apache Kafka y una herramienta de captura de datos de cambio como Debezium a la implementación, se pueden resolver problemas con múltiples instancias de servicio y escrituras en la base de datos. Debezium recoge los cambios directamente de la base de datos y envía mensajes de eventos de CDC al broker de mensajes conectado, asegurando que cualquier cambio en la base de datos se publique en Kafka y se reciba por la instancia de servicio. Esta pila tecnológica también se puede utilizar para consultas mediante la construcción de una base de datos de modelo de lectura dedicada para la API de GraphQL.

Available in English

1. GraphQL Subscriptions with Kafka and Debezium

Short description:

Bienvenidos a mi charla relámpago sobre suscripciones de GraphQL con Kafka y Debezium. Tenemos tres clientes y un servicio que proporciona una API de GraphQL. Cuando el cliente uno agrega un nuevo cliente, el servicio puede enviar eventos a los clientes dos y tres. Sin embargo, puede haber problemas cuando hay múltiples instancias del servicio o al escribir datos en una base de datos. Para resolver estos problemas, podemos agregar un mensaje broker como Apache Kafka y una herramienta de captura de datos de cambio como Debezium a nuestra implementación.

Hola y bienvenidos a mi charla relámpago sobre suscripciones de GraphQL con Kafka y Debezium. Mi nombre es Nils y soy un desarrollador de software freelance de Hamburgo, Alemania.

Echemos un vistazo a esta imagen aquí. Tenemos tres clientes y tenemos un servicio que proporciona una API de GraphQL. El cliente número dos y el cliente número tres envían suscripciones al servicio para recibir información sobre nuevos clientes. Cuando el cliente número uno envía una mutación para agregar un nuevo cliente, nuestro servicio y nuestra API de GraphQL pueden enviar eventos al cliente número dos y tres informándoles sobre los nuevos clientes.

En la vida real, esta configuración puede ser un poco más compleja porque podríamos tener más de una instancia del mismo servicio como en este caso. En este caso, el cliente número dos envía la solicitud de suscripción a la instancia del servicio número uno, mientras que el cliente número tres envía su solicitud a la instancia del servicio número dos. Ahora, cuando el cliente número uno ejecuta la mutación en la instancia del servicio número uno, la instancia del servicio número uno puede informar al cliente número dos sobre el nuevo cliente. Pero desafortunadamente, el cliente número tres no recibe un evento porque la instancia del servicio número dos no sabe nada sobre el nuevo cliente agregado ni sobre la mutación ejecutada.

Para resolver este problema, la instancia del servicio número uno debe informar a la instancia del servicio número dos sobre las cosas que suceden, como la mutación. Podemos resolver este problema agregando un mensaje broker como Apache Kafka a nuestra implementación. En este caso, el cliente uno todavía envía una mutación a la instancia del servicio número uno. Pero en lugar de enviar la suscripción directamente al cliente dos, la instancia del servicio uno envía un mensaje al mensaje broker. El mensaje contiene la información sobre el nuevo cliente y tanto la instancia del servicio uno como la dos están escuchando este mensaje del mensaje broker. Cuando reciben el mensaje, pueden enviar los datos de la suscripción a ambos de sus clientes conectados, el dos y el tres. Ambos clientes están contentos ahora.

En la vida real, las cosas son un poco más complejas porque estamos escribiendo data en una base de datos. En este caso, la instancia del servicio uno y dos deberían escribir en la misma base de datos, y cuando la instancia del servicio uno escribe algo en la base de datos, el mensaje aún se enviará a Apache Kafka y los clientes dos y tres serán informados sobre el nuevo cliente. Pero en la vida real, las cosas pueden salir mal. Por ejemplo, después de confirmar el nuevo cliente, la instancia del servicio número uno no puede enviar un mensaje a Kafka por cualquier motivo. En ese caso, ninguno de los clientes recibirá un evento. Además, lo que puede suceder es que tengamos otra aplicación que escriba directamente en la base de datos para que la instancia del servicio número uno no sepa acerca de estos cambios y, por lo tanto, no pueda enviar un mensaje a través del mensaje broker. Y nuevamente, los clientes dos y tres no son informados sobre el cambio en nuestros datos.

Para resolver este tipo de problemas, podemos agregar una herramienta de captura de datos de cambio como Debezium a nuestra pila de herramientas. Una herramienta de captura de datos de cambio lee todo lo que sucede en su base de datos como inserciones, actualizaciones y eliminaciones, y escribe eventos para estas acciones en un mensaje broker. En el caso de Debezium, Debezium publica eventos de cambio en Apache Kafka. Un evento de cambio de Debezium podría verse así. Tiene un atributo de origen donde se establece la tabla, por ejemplo. Tiene una operación como actualización, eliminación o inserción que describe lo que ha sucedido en la base de datos, y tiene los datos antes y después.

2. Arquitectura con Debezium y Kafka

Short description:

En este caso, Debezium recoge los cambios directamente de la base de datos y envía mensajes de eventos CDC al mensaje broker conectado. Las instancias del servicio reciben estos eventos, los interpretan y envían datos de suscripción a los clientes. Gracias a Debezium y Apache Kafka, podemos estar seguros de que cualquier cambio en la base de datos se publicará en Kafka y será recibido por nuestra instancia del servicio. También podemos utilizar esta combinación de tecnologías para consultas mediante la creación de una base de datos de modelo de lectura dedicada para nuestra API de GraphQL.

En este caso, los datos antes y después de una operación de actualización. Nuestra arquitectura con Debezium se vería así. El cliente uno todavía envía la mutación directamente a la instancia del servicio uno. La instancia del servicio número uno escribe el nuevo cliente en la base de datos o alguna otra aplicación escribe algo en la base de datos.

Y en ambos casos, Debezium recoge los cambios directamente de tu base de datos y envía un mensaje de evento CDC al mensaje broker conectado. Tanto la instancia del servicio número uno como la número dos reciben estos eventos de captura de cambios CDC, pueden interpretar estos eventos y enviar datos de suscripción a través de su API de GraphQL al cliente número dos y al cliente número tres. Y ambos clientes están contentos ahora.

Gracias a las garantías de entrega que Debezium y Apache Kafka nos brindan, podemos estar seguros de que cualquier cambio en la base de datos, ya sea una actualización, inserción o eliminación, se publicará en Kafka y será recibido por nuestra instancia del servicio, de modo que podemos estar seguros de que podemos enviar una suscripción para cualquier cambio en la base de datos por cualquier motivo que haya cambiado la base de datos.

Si quieres probar esto por ti mismo, he creado una pequeña aplicación de muestra construida con GraphQL Java y Spring para GraphQL. Puedes encontrar el código fuente en el repositorio de GitHub en la siguiente URL.

Por cierto, esta combinación de tecnologías no solo la podemos utilizar para suscripciones, sino que también creo que la podemos utilizar para consultas. Podríamos construir una base de datos de modelo de lectura dedicada para nuestra API de GraphQL. Imagina que tenemos una lista de microservicios cada uno conectado a su propia base de datos. Utilizando Debezium y Apache Kafka, podemos recoger todos los cambios de todas las bases de datos y construir una base de datos optimizada y dedicada solo para nuestra API de GraphQL. La API de GraphQL puede leer los datos de esta base de datos específica y no necesita consultar todos los microservicios para obtener los datos solicitados en una consulta de GraphQL. Hasta aquí, muchas gracias por hoy, nos vemos y diviértete construyendo APIs de GraphQL.

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

GraphQL Galaxy 2021GraphQL Galaxy 2021
32 min
From GraphQL Zero to GraphQL Hero with RedwoodJS
Top Content
We all love GraphQL, but it can be daunting to get a server up and running and keep your code organized, maintainable, and testable over the long term. No more! Come watch as I go from an empty directory to a fully fledged GraphQL API in minutes flat. Plus, see how easy it is to use and create directives to clean up your code even more. You're gonna love GraphQL even more once you make things Redwood Easy!
Vue.js London Live 2021Vue.js London Live 2021
24 min
Local State and Server Cache: Finding a Balance
Top Content
How many times did you implement the same flow in your application: check, if data is already fetched from the server, if yes - render the data, if not - fetch this data and then render it? I think I've done it more than ten times myself and I've seen the question about this flow more than fifty times. Unfortunately, our go-to state management library, Vuex, doesn't provide any solution for this.For GraphQL-based application, there was an alternative to use Apollo client that provided tools for working with the cache. But what if you use REST? Luckily, now we have a Vue alternative to a react-query library that provides a nice solution for working with server cache. In this talk, I will explain the distinction between local application state and local server cache and do some live coding to show how to work with the latter.
GraphQL Galaxy 2022GraphQL Galaxy 2022
16 min
Step aside resolvers: a new approach to GraphQL execution
Though GraphQL is declarative, resolvers operate field-by-field, layer-by-layer, often resulting in unnecessary work for your business logic even when using techniques such as DataLoader. In this talk, Benjie will introduce his vision for a new general-purpose GraphQL execution strategy whose holistic approach could lead to significant efficiency and scalability gains for all GraphQL APIs.

Workshops on related topic

GraphQL Galaxy 2021GraphQL Galaxy 2021
140 min
Build with SvelteKit and GraphQL
Top Content
Featured WorkshopFree
Have you ever thought about building something that doesn't require a lot of boilerplate with a tiny bundle size? In this workshop, Scott Spence will go from hello world to covering routing and using endpoints in SvelteKit. You'll set up a backend GraphQL API then use GraphQL queries with SvelteKit to display the GraphQL API data. You'll build a fast secure project that uses SvelteKit's features, then deploy it as a fully static site. This course is for the Svelte curious who haven't had extensive experience with SvelteKit and want a deeper understanding of how to use it in practical applications.

Table of contents:
- Kick-off and Svelte introduction
- Initialise frontend project
- Tour of the SvelteKit skeleton project
- Configure backend project
- Query Data with GraphQL
- Fetching data to the frontend with GraphQL
- Styling
- Svelte directives
- Routing in SvelteKit
- Endpoints in SvelteKit
- Deploying to Netlify
- Navigation
- Mutations in GraphCMS
- Sending GraphQL Mutations via SvelteKit
- Q&A
React Advanced Conference 2022React Advanced Conference 2022
95 min
End-To-End Type Safety with React, GraphQL & Prisma
Featured WorkshopFree
In this workshop, you will get a first-hand look at what end-to-end type safety is and why it is important. To accomplish this, you’ll be building a GraphQL API using modern, relevant tools which will be consumed by a React client.
Prerequisites: - Node.js installed on your machine (12.2.X / 14.X)- It is recommended (but not required) to use VS Code for the practical tasks- An IDE installed (VSCode recommended)- (Good to have)*A basic understanding of Node.js, React, and TypeScript
GraphQL Galaxy 2022GraphQL Galaxy 2022
112 min
GraphQL for React Developers
Featured Workshop
There are many advantages to using GraphQL as a datasource for frontend development, compared to REST APIs. We developers in example need to write a lot of imperative code to retrieve data to display in our applications and handle state. With GraphQL you cannot only decrease the amount of code needed around data fetching and state-management you'll also get increased flexibility, better performance and most of all an improved developer experience. In this workshop you'll learn how GraphQL can improve your work as a frontend developer and how to handle GraphQL in your frontend React application.
React Summit 2022React Summit 2022
173 min
Build a Headless WordPress App with Next.js and WPGraphQL
Top Content
WorkshopFree
In this workshop, you’ll learn how to build a Next.js app that uses Apollo Client to fetch data from a headless WordPress backend and use it to render the pages of your app. You’ll learn when you should consider a headless WordPress architecture, how to turn a WordPress backend into a GraphQL server, how to compose queries using the GraphiQL IDE, how to colocate GraphQL fragments with your components, and more.
GraphQL Galaxy 2020GraphQL Galaxy 2020
106 min
Relational Database Modeling for GraphQL
Top Content
WorkshopFree
In this workshop we'll dig deeper into data modeling. We'll start with a discussion about various database types and how they map to GraphQL. Once that groundwork is laid out, the focus will shift to specific types of databases and how to build data models that work best for GraphQL within various scenarios.
Table of contentsPart 1 - Hour 1      a. Relational Database Data Modeling      b. Comparing Relational and NoSQL Databases      c. GraphQL with the Database in mindPart 2 - Hour 2      a. Designing Relational Data Models      b. Relationship, Building MultijoinsTables      c. GraphQL & Relational Data Modeling Query Complexities
Prerequisites      a. Data modeling tool. The trainer will be using dbdiagram      b. Postgres, albeit no need to install this locally, as I'll be using a Postgres Dicker image, from Docker Hub for all examples      c. Hasura
GraphQL Galaxy 2021GraphQL Galaxy 2021
48 min
Building GraphQL APIs on top of Ethereum with The Graph
WorkshopFree
The Graph is an indexing protocol for querying networks like Ethereum, IPFS, and other blockchains. Anyone can build and publish open APIs, called subgraphs, making data easily accessible.

In this workshop you’ll learn how to build a subgraph that indexes NFT blockchain data from the Foundation smart contract. We’ll deploy the API, and learn how to perform queries to retrieve data using various types of data access patterns, implementing filters and sorting.

By the end of the workshop, you should understand how to build and deploy performant APIs to The Graph to index data from any smart contract deployed to Ethereum.