0Pricing
Cloud & IT Cert Prep · レッスン

疎結合メッセージングのための Azure Service Bus

キューとトピックを備えた Service Bus 名前空間を作成し、アプリケーションからメッセージを送受信して、失敗したメッセージを処理するデッドレター キューを構成します。

「疎結合メッセージングのための Azure Service Bus」はCoddyKit上の無料Cloud & IT Cert Prepレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCloud & IT Cert Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。

メッセージングで疎結合にする理由

密結合のアーキテクチャでは、サービス同士が同期的に呼び出し合います。そのため、下流のサービスが遅延したり停止したりすると、呼び出し元も処理がブロックされたり失敗したりします。メッセージングキューは、プロデューサーとコンシューマーの間に非同期のバッファーを設けるため、下流サービスの遅延による障害が上流へ連鎖するのを防げます。Azure Service Bus は Microsoft のエンタープライズ向けメッセージングサービスであり、配信保証、順序制御、デッドレター機能を備えたキュー(ポイントツーポイント)とトピック(パブリッシュ/サブスクライブ)を提供します。

Service Bus の名前空間とレベル

Service Bus の名前空間は、すべてのメッセージングエンティティ(キューとトピック)を格納する最上位のコンテナーであり、FQDN エンドポイント(例: myns.servicebus.windows.net)を提供します。名前空間には 3 つのレベルがあります。Basic(キューのみ、トピックなし、メッセージサイズは最大 256 KB)、Standard(キューとトピック、最大 256 KB)、Premium(キューとトピック、最大 100 MB のメッセージ、専用キャパシティ、VNet 統合、geo-disaster recovery)です。SLA に基づくパフォーマンスが必要な本番ワークロードでは、Premium が必要です。

# Create a Service Bus namespace (Standard tier)
az servicebus namespace create \
  --resource-group myRG \
  --name myservicebusns \
  --location eastus \
  --sku Standard

キュー: ポイントツーポイントメッセージング

Service Bus キューはメッセージを FIFO 順で格納し、各メッセージを1 つのコンシューマーだけに配信します。コンシューマーはピークロックの仕組みを使用してメッセージを受信します。処理中のメッセージは一時的に他のコンシューマーから見えなくなります。コンシューマーが正常に処理を完了した場合は、CompleteMessage()を呼び出してキューから削除します。処理に失敗した場合は、AbandonMessage()を呼び出すことで、メッセージが再び表示され、別の試行が可能になります。設定可能な配信試行回数を超えると、処理できないメッセージはデッドレターキュー(DLQ)に移動されます。

# Create a Service Bus queue with DLQ enabled
az servicebus queue create \
  --resource-group myRG \
  --namespace-name myservicebusns \
  --name orders \
  --max-delivery-count 5 \
  --default-message-time-to-live P7D \
  --dead-lettering-on-message-expiration true

トピックとサブスクリプション

トピックはパブリッシュ/サブスクライブパターンを実装します。プロデューサーがトピックにメッセージを送信すると、そのトピック上の任意の数のサブスクリプションが、それぞれメッセージのコピーを受信します。サブスクリプションにはフィルター(SQL または相関式)を設定し、メッセージの一部だけを受信できます。たとえば、Priority プロパティが High と等しいメッセージだけを受信する HighPriority サブスクリプションを作成できます。これにより、1 つのトピックから多数の下流サービスへメッセージをファンアウトし、それぞれが異なるイベントのサブセットを処理できます。

# Create a topic and two subscriptions with filters
az servicebus topic create \
  --resource-group myRG \
  --namespace-name myservicebusns \
  --name order-events

az servicebus topic subscription create \
  --resource-group myRG \
  --namespace-name myservicebusns \
  --topic-name order-events \
  --name high-priority-sub

az servicebus topic subscription rule create \
  --resource-group myRG \
  --namespace-name myservicebusns \
  --topic-name order-events \
  --subscription-name high-priority-sub \
  --name PriorityFilter \
  --filter-sql-expression 'Priority = '"'"'High'"'"''

メッセージの送受信

Azure Service Bus SDK は、送受信に使用する ServiceBusClient を提供します。送信するには、ServiceBusSender を作成して SendMessageAsync() を呼び出します。受信するには、ServiceBusReceiver を作成して ReceiveMessageAsync()(プル型)を呼び出すか、イベントハンドラーを備えた ServiceBusProcessor を使用して、プッシュ型で継続的に処理します。Service Bus SDK で DefaultAzureCredential を使用すると、接続文字列が不要になり、パスワードレスのパターンを維持できます。

# Python: Send a message to a Service Bus queue
from azure.servicebus import ServiceBusClient, ServiceBusMessage
from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()
client = ServiceBusClient(
  fully_qualified_namespace='myservicebusns.servicebus.windows.net',
  credential=credential
)
with client.get_queue_sender(queue_name='orders') as sender:
    msg = ServiceBusMessage('{ 'orderId': '12345', 'amount': 99.99 }')
    sender.send_messages(msg)
    print('Message sent')

デッドレターキュー

デッドレターキュー(DLQ)は、配信できないメッセージを自動的に受け取るサブキューです。メッセージは、最大配信回数を超えた場合、期限切れになった場合(TTL が経過した場合)、またはトピックのサブスクリプションフィルターの評価に失敗した場合に、デッドレター化されます。DLQ の監視は不可欠です。DLQ が増え続けている場合は、処理にシステム的な障害が発生していることを示します。DLQ のメッセージには元の内容に加えて、根本原因の診断に役立つデッドレターの理由と説明のプロパティが Service Bus によって追加されます。

# Read messages from the dead-letter queue
az servicebus queue show \
  --resource-group myRG \
  --namespace-name myservicebusns \
  --name 'orders/$DeadLetterQueue' \
  --query 'countDetails.deadLetterMessageCount'

順序制御のためのメッセージセッション

セッションを使用すると、同じ論理グループに属するメッセージの厳密な順序を維持できます。各メッセージには SessionId(例: 顧客 ID や注文 ID)が付与され、セッション対応のコンシューマーは、特定のセッションに属するすべてのメッセージを FIFO 順で排他的に受信します。セッションは、手順を順番どおりに実行する必要があるワークフローに不可欠です。たとえば、特定の注文に関するすべてのイベントを Created → PaymentReceived → Shipped → Delivered の順に処理する場合などです。セッションは、キューまたはサブスクリプションの作成時に有効にします。

Service Bus、Event Grid、Event Hubs の比較

これら 3 つの Azure メッセージングサービスは混同されがちです。Service Busは、順序制御、セッション、DLQ を備えた信頼性の高いトランザクション対応のエンタープライズメッセージング向けで、注文処理、金融トランザクション、ワークフローオーケストレーションに適しています。Event Gridは、リアクティブなイベントルーティング(BLOB がアップロードされた、VM が削除されたなど)向けで、複数のハンドラーへのファンアウトに対応しますが、順序制御や再生には対応しません。Event Hubsは、毎秒数百万件のイベントを扱う高スループットのイベントストリーミング向けで、再生機能を備えており、IoT テレメトリやログ取り込みに適しています。順序、スループット、耐久性の要件に基づいて選択してください。

geo-disaster recovery

Service Bus のGeo-Disaster Recovery(Geo-DR)は、名前空間のメタデータ(キュー、トピック、サブスクリプション、アクセス ポリシー)をセカンダリ リージョンにレプリケートします。ペアリングされたリージョンは 1 つのエイリアス ホスト名を共有します。プライマリに障害が発生した場合は、フェールオーバーを開始すると、エイリアスがセカンダリを解決先として返します。ただし、Standard レベルではメッセージデータ(処理中のメッセージ)はレプリケートされません。メッセージをレプリケートできるのは Premium レベルの Geo-DR だけです。ミッションクリティカルなメッセージングで RTO と RPO の要件を満たすには、Premium と Geo-DR を使用してください。

スケーリングとパーティション分割されたエンティティ

高スループットのシナリオでは、キューやトピックの作成時にパーティション分割を有効にします。パーティション分割されたエンティティは、内部で複数のメッセージブローカーとストレージフラグメントを使用し、スループット容量を増やします。Standard レベルでは、パーティション分割されたエンティティの合計サイズは最大 80 GB です。各メッセージは、その PartitionKey プロパティに基づいてパーティションにルーティングされます(セッションが有効な場合の既定値はセッション ID です)。パーティション分割は作成時に一度だけ決定する項目であり、既存のキューをパーティション分割することはできません。パーティション分割の複雑さを伴わずに最高レベルの保証されたスループットを得るには、Premium レベルを使用してください。

# Create a partitioned queue (Standard tier)
az servicebus queue create \
  --resource-group myRG \
  --namespace-name myservicebusns \
  --name orders-partitioned \
  --enable-partitioning true

Service Bus の正常性の監視

Azure Monitorで監視する主な Service Bus メトリックは次のとおりです。Active Messages(キューの深さ。増加している場合はコンシューマーの遅延を示します)、Dead-lettered Messages(処理エラー)、Server Errors と User Errors(認証やスロットリングの問題)、Incoming Requests(全体的なスループット)。メトリックアラートを設定し、デッドレターキューがしきい値を超えて増加した場合や、アクティブなメッセージが一定時間にわたって消費されていない場合に、運用チームへ通知されるようにしてください。

クイックチェック

このレッスンで学んだ Microsoft Azure Fundamentals(AZ-900)の概念について、理解度を確認します。

レッスンのまとめ

このレッスンでは、Service Bus キューがピーク ロックによる配信と、失敗したメッセージを格納するデッドレターキューを備えたポイントツーポイントメッセージングを提供すること、トピックとサブスクリプションがフィルタールールによって複数のコンシューマーにメッセージをファンアウトすること、そしてセッションによって同じ論理グループに属するメッセージを順序どおりに処理できることを学びました。次は、最新のマイクロサービスをデプロイするための Azure Container Apps について学びます。

よくある質問

「疎結合メッセージングのための Azure Service Bus」レッスンは無料ですか?

はい。「疎結合メッセージングのための Azure Service Bus」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cloud & IT Cert Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。

「疎結合メッセージングのための Azure Service Bus」で何を学びますか?

キューとトピックを備えた Service Bus 名前空間を作成し、アプリケーションからメッセージを送受信して、失敗したメッセージを処理するデッドレター キューを構成します。 ブラウザで直接実行するハンズオンコードでCloud & IT Cert Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Cloud & IT Cert Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのCloud & IT Cert Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「疎結合メッセージングのための Azure Service Bus」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このCloud & IT Cert Prepレッスンでコードを書いて実行できますか?

はい。すべてのCloud & IT Cert Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. パスワードレス認証のためのマネージド ID
  2. 疎結合メッセージングのための Azure Service Bus
  3. Azure Container Apps
  4. エンドツーエンドの開発者ワークフロー
← Cloud & IT Cert Prepに戻る