La missatgeria asíncrona és una tècnica de comunicació entre microserveis que permet que els serveis es comuniquin sense necessitat d'esperar una resposta immediata. Aquesta tècnica és especialment útil per a sistemes distribuïts on la latència i la disponibilitat poden variar.

Conceptes Clau

  1. Asincronia: La comunicació no és immediata; el servei emissor no espera una resposta immediata del servei receptor.
  2. Cues de Missatges: Utilitzades per emmagatzemar missatges fins que el servei receptor estigui disponible per processar-los.
  3. Publicació/Subscripció (Pub/Sub): Un patró on els serveis publiquen missatges a un canal i altres serveis es subscriuen per rebre aquests missatges.
  4. Durabilitat: Garantia que els missatges no es perdran, fins i tot si hi ha fallades en el sistema.

Avantatges de la Missatgeria Asíncrona

  • Desacoblament: Els serveis no necessiten conèixer l'estat o la disponibilitat dels altres serveis.
  • Escalabilitat: Permet gestionar grans volums de missatges sense sobrecarregar els serveis.
  • Resiliència: Els missatges es poden emmagatzemar i processar més tard si un servei està temporalment fora de servei.

Desavantatges de la Missatgeria Asíncrona

  • Complexitat: Afegir cues de missatges i gestionar la consistència pot augmentar la complexitat del sistema.
  • Latència: Pot haver-hi un retard en el processament dels missatges.
  • Gestió d'Errors: És més complicat gestionar errors i garantir la consistència de dades.

Eines i Tecnologies Populars

Eina/Servei Descripció
RabbitMQ Sistema de missatgeria que implementa el protocol AMQP.
Apache Kafka Plataforma de streaming distribuït que permet la publicació i subscripció.
Amazon SQS Servei de cua de missatges completament gestionat per AWS.
Google Pub/Sub Servei de missatgeria asíncrona gestionat per Google Cloud.

Exemples Pràctics

Exemple 1: Enviament de Missatges amb RabbitMQ

import pika

# Connexió a RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# Creació de la cua
channel.queue_declare(queue='hello')

# Enviament del missatge
channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")

# Tancament de la connexió
connection.close()

Exemple 2: Recepció de Missatges amb RabbitMQ

import pika

# Connexió a RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# Creació de la cua
channel.queue_declare(queue='hello')

# Definició de la funció de callback
def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)

# Consumir missatges de la cua
channel.basic_consume(queue='hello',
                      on_message_callback=callback,
                      auto_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

Exercici Pràctic

Objectiu

Implementar un sistema de missatgeria asíncrona utilitzant RabbitMQ per enviar i rebre missatges entre dos microserveis.

Passos

  1. Instal·lar RabbitMQ: Assegura't de tenir RabbitMQ instal·lat i en funcionament.
  2. Crear un Productor: Escriu un servei que enviï missatges a una cua.
  3. Crear un Consumidor: Escriu un servei que rebi i processi missatges de la cua.

Solució

Productor

import pika

def send_message(message):
    connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
    channel = connection.channel()
    channel.queue_declare(queue='task_queue', durable=True)
    channel.basic_publish(exchange='',
                          routing_key='task_queue',
                          body=message,
                          properties=pika.BasicProperties(
                             delivery_mode=2,  # make message persistent
                          ))
    print(" [x] Sent %r" % message)
    connection.close()

send_message('Hello, Microservices!')

Consumidor

import pika
import time

def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)
    time.sleep(body.count(b'.'))
    print(" [x] Done")
    ch.basic_ack(delivery_tag=method.delivery_tag)

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='task_queue', durable=True)
channel.basic_qos(prefetch_count=1)
channel.basic_consume(queue='task_queue', on_message_callback=callback)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()

Errors Comuns i Consells

  • No Persistir Missatges: Assegura't que els missatges siguin persistents per evitar pèrdues en cas de fallades.
  • No Gestionar Errors: Implementa mecanismes per gestionar errors i reintents.
  • Sobrecàrrega de la Cua: Monitoritza la cua per evitar sobrecàrregues i assegurar un processament eficient.

Conclusió

La missatgeria asíncrona és una tècnica poderosa per a la comunicació entre microserveis, permetent desacoblament, escalabilitat i resiliència. Tot i que pot afegir complexitat al sistema, els avantatges superen els desavantatges en molts casos. Amb les eines i tecnologies adequades, pots implementar sistemes robustos i eficients.

En el següent tema, explorarem els diferents protocols de comunicació com gRPC i GraphQL, que ofereixen alternatives a les APIs RESTful i la missatgeria asíncrona.

© Copyright 2024. Tots els drets reservats