Azure Service Bus は、分散アプリケーション間の信頼性の高い通信を促進するフルマネージドのメッセージ ブローカーです。先入れ先出し (FIFO) シーケンスの確保など、メッセージを特定の順序で処理する必要があるアプリケーションの場合、Azure Service Bus のセッションはメッセージ処理のための効果的なメカニズムを提供します。
Spring Boot アプリケーションのコンテキストでは、Azure Service Bus トピックのセッションを利用することで、同じセッション ID を持つメッセージが一度に 1 つのコンシューマーによって正しい順序で処理されるようになります。このソリューションは、メッセージの順序を維持しながら高スループットのメッセージング シナリオを処理する場合に特に役立ちます。
このガイドでは、Azure Service Bus からのメッセージを FIFO 順序で消費し、複雑なインフラストラクチャを必要とせずにセッションを使用することで信頼性とスケーラビリティを確保するように Spring Boot アプリケーションを構成する方法について概要を説明します。
複数のインスタンスにデプロイされた Spring Boot アプリケーションが Azure Service Bus トピックからのメッセージを FIFO 順序で消費する場合、トピックのセッションを使用し、当局間で調整されたセッションを管理するようにアプリケーションを構成できます。その方法は次のとおりです:
Azure は、メッセージをセッションで正常に消費できるようにする Java 用のライブラリを提供します。ここに 1 つのアプローチがあります:
Spring Boot プロジェクト (Maven の pom.xml) に Azure Service Bus の依存関係を追加します。
<dependency> <groupId>com.azure</groupId> <artifactId>azure-messaging-servicebus</artifactId> <version>7.5.0</version> <!-- check for the last version --> </dependency>
Azure Service Bus トピックに接続するようにアプリケーションを構成します。基本的な構成は次のとおりです:
import com.azure.messaging.servicebus.*; @Service public class AzureServiceBusConsumer { private final String connectionString = "Endpoint=sb://<your-service-bus>.servicebus.windows.net/;SharedAccessKeyName=<key-name>;SharedAccessKey=<key>"; private final String topicName = "<your-topic>"; private final String subscriptionName = "<your-subscription>"; public void startSessionProcessor() { ServiceBusClientBuilder clientBuilder = new ServiceBusClientBuilder() .connectionString(connectionString); ServiceBusProcessorClient processorClient = clientBuilder .sessionProcessor() // Using session mode .topicName(topicName) .subscriptionName(subscriptionName) .processMessage(this::processMessage) .processError(this::processError) .buildProcessorClient(); // Start session processing in asynchronous mode processorClient.start(); } private void processMessage(ServiceBusReceivedMessageContext context) { ServiceBusReceivedMessage message = context.getMessage(); System.out.printf("Processing message from session: %s. Contents: %s%n", message.getSessionId(), message.getBody()); // Process the message here, respecting the order of arrival in the session context.complete(); // Mark the message as processed } private void processError(ServiceBusErrorContext context) { System.err.printf("Error occurred while processing: %s%n", context.getException().getMessage()); } }
sessionProcessor() を使用すると、各セッションは一度に 1 つのインスタンスのみによって消費され、インスタンスの数に関係なく、セッション内のメッセージは常に FIFO 順序で処理されます。
アプリケーションの複数の EC2 インスタンスが トピック に接続されている場合:
同一の Service Bus 構成を使用して Spring Boot アプリケーションを EC2 インスタンスにデプロイすると、セッションを動的に管理できるようになります。インスタンスがダウンした場合、Azure Service Bus は待機中のセッションを接続されている別の EC2 インスタンスに自動的に再割り当てします。
Spring Boot アプリケーションの開始時に @PostConstruct を使用してコンシューマーを起動し、セッション内消費を開始します。
<dependency> <groupId>com.azure</groupId> <artifactId>azure-messaging-servicebus</artifactId> <version>7.5.0</version> <!-- check for the last version --> </dependency>
結論として、FIFO メッセージ処理のための Azure Service Bus と Spring Boot アプリケーションの統合は、セッションを利用することで効果的に実現できます。 Azure Service Bus トピックでセッションを有効にし、メッセージを特定のセッション ID に関連付けることにより、各セッション内でメッセージが到着した正確な順序で処理されるようになります。
Azure SDK for Java を使用すると、セッション ベースの方法でメッセージを消費するように Spring Boot アプリケーションを構成でき、各セッションが一度に 1 つのコンシューマーによって処理されることが保証されます。これにより、マルチスレッド環境であってもメッセージの並べ替えのリスクが排除され、信頼性の高い順序付けられた処理が保証されます。
このアプローチは、分散ワークロードの管理における効率と柔軟性を維持しながら、アプリケーションが厳密な FIFO 順序でメッセージを処理することを保証する、スケーラブルで回復力のあるソリューションを提供します。
以上がAzure Service Bus と Spring Boot を使用した FIFO メッセージングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。