В современных архитектурах программного обеспечения шаблоны обмена сообщениями играют решающую роль в обеспечении масштабируемости и разделения систем. Одним из таких шаблонов является шаблон обмена сообщениями «Разветвленная публикация/подписка». В этой статье блога мы рассмотрим шаблон публикации/подписки Fan-Out и предоставим несколько методов вместе с примерами кода для его эффективной реализации.
Что такое шаблон обмена сообщениями «Разветвленная публикация/подписка»?
Шаблон «Разветвленная публикация/подписка» — это шаблон обмена сообщениями, в котором одно сообщение, также известное как событие, доставляется нескольким подписчикам. Этот шаблон обеспечивает модель связи «один ко многим», при которой издатель отправляет событие, а несколько подписчиков получают и обрабатывают событие независимо.
Методы реализации шаблона разветвленной публикации/подписки:
- Использование брокера сообщений.
Брокер сообщений действует как посредник между издателями и подписчиками, облегчая распространение событий. Вот пример использования RabbitMQ, популярного брокера сообщений, на Python:
import pika
# Publisher
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='logs', exchange_type='fanout')
channel.basic_publish(exchange='logs', routing_key='', body='Hello World!')
# Subscriber
def callback(ch, method, properties, body):
print("Received:", body)
channel.basic_consume(queue='', on_message_callback=callback, auto_ack=True)
channel.start_consuming()
- Использование платформ, управляемых событиями.
Среды, управляемые событиями, предоставляют встроенные функции для реализации шаблона публикации/подписки с разветвлением. Вот пример использования Node.js и популярной платформы Express.js вместе с модулемEventEmitter
:
const EventEmitter = require('events');
const express = require('express');
const app = express();
const eventEmitter = new EventEmitter();
// Publisher
app.get('/publish', (req, res) => {
const eventData = 'Hello World!';
eventEmitter.emit('event', eventData);
res.send('Event published successfully.');
});
// Subscriber
eventEmitter.on('event', (data) => {
console.log('Received:', data);
});
app.listen(3000, () => {
console.log('Server started on port 3000');
});
- Использование облачных служб публикации/подписки.
Облачные поставщики предлагают управляемые службы публикации/подписки, которые упрощают реализацию шаблона публикации/подписки с разветвлением. Вот пример использования Google Cloud Pub/Sub на Java:
import com.google.cloud.pubsub.v1.TopicAdminClient;
import com.google.cloud.pubsub.v1.Publisher;
import com.google.pubsub.v1.ProjectTopicName;
import com.google.protobuf.ByteString;
import com.google.pubsub.v1.PubsubMessage;
// Publisher
ProjectTopicName topicName = ProjectTopicName.of("project-id", "topic-id");
Publisher publisher = Publisher.newBuilder(topicName).build();
ByteString messageData = ByteString.copyFromUtf8("Hello World!");
PubsubMessage pubsubMessage = PubsubMessage.newBuilder().setData(messageData).build();
publisher.publish(pubsubMessage);
// Subscriber
String subscriptionId = "subscription-id";
SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create();
subscriptionAdminClient.createSubscription(
SubscriptionName.of("project-id", subscriptionId),
TopicName.of("project-id", "topic-id"),
PushConfig.getDefaultInstance(),
10 // Acknowledgement deadline in seconds
);
Subscriber subscriber = Subscriber.newBuilder(
SubscriptionName.of("project-id", subscriptionId), new MessageReceiver() {
@Override
public void receiveMessage(PubsubMessage message, AckReplyConsumer consumer) {
System.out.println("Received: " + message.getData().toStringUtf8());
consumer.ack();
}
}).build();
subscriber.startAsync().awaitRunning();
Шаблон обмена сообщениями «Разветвленная публикация/подписка» обеспечивает масштабируемый и несвязанный подход к архитектурам, управляемым событиями. Используя брокеры сообщений, управляемые событиями платформы или облачные службы публикации и подписки, разработчики могут эффективно реализовать этот шаблон и обеспечить эффективную связь между издателями и несколькими подписчиками. Используя методы и примеры кода, представленные в этой статье, вы можете начать создавать надежные системы, управляемые событиями.
Не забудьте выбрать подходящий метод в зависимости от ваших конкретных требований и стека технологий. Приятного кодирования!