1

背景情報として、当社は 200 を超える店舗を持つ小売業者です。200 以上の RabbitMQ サーバー (各ストアに 1 つのサーバー) との rabbitmq フェデレーションを使用します。各 RabbitMQ サーバーには 4 つの交換があります。そのため、合計で約 800 の取引所があります。

メッセージが発行される中央サーバーが 1 つあります。これは、他の 200 台のサーバーのアップストリーム サーバーとして使用されます。製品の変更があると、メッセージが中央サーバーに送信され、他の rabbitmq サーバーに転送され、各ストアでローカルに処理されます。私たちのアプリケーションは、Windows サーバー上の .NET フレームワークで実行されます (Masstransit を使用して RabbitMQ を処理します)。

イベントを rabbitMQ に発行するときに、タイムアウト エラーが発生することがあります。これは例です:

Properties  
message_id: f68a0000-15f3-0670-085b-08d66b92a0b1
delivery_mode:  2
headers:    
x-correlation-id:   18799970-fea8-431e-8608-d02496194a0a
Content-Type:   application/vnd.masstransit+json
publishId:  1
MT-Reason:  fault
MT-Fault-Message:   Publishing message of type MyCompany.Event.Message timed out after 5000 milliseconds.
MT-Fault-Timestamp: 2018-12-27T00:32:33.6076503Z
MT-Fault-StackTrace:    at MyCompany.ProductCommand.Listener.UpsertProductCommandListener.<PublishMessage>d__10`1.MoveNext() 
at MyCompany.ProductCommand.Listener.UpsertProductCommandListener.<PublishUpdatedEvents>d__8.MoveNext() 
at MyCompany.ProductCommand.Listener.UpsertProductCommandListener.<Consume>d__7.MoveNext() 
at MassTransit.AutofacIntegration.AutofacConsumerFactory`1.<Send>d__3`1.MoveNext() 
at MassTransit.Pipeline.Filters.ConsumerMessageFilter`2.<GreenPipes-IFilter<MassTransit-ConsumeContext<TMessage>>-Send>d__4.MoveNext() 
at MassTransit.Pipeline.Filters.ConsumerMessageFilter`2.<GreenPipes-IFilter<MassTransit-ConsumeContext<TMessage>>-Send>d__4.MoveNext() 
at GreenPipes.Filters.TeeFilter`1.<Send>d__5.MoveNext() 
at GreenPipes.Filters.OutputPipeFilter`2.<GreenPipes-IFilter<TInput>-Send>d__6.MoveNext() 
at GreenPipes.Filters.OutputPipeFilter`2.<GreenPipes-IFilter<TInput>-Send>d__6.MoveNext() 
at MassTransit.Pipeline.Filters.DeserializeFilter.<Send>d__4.MoveNext() 
at GreenPipes.Filters.RescueFilter`2.<GreenPipes-IFilter<TContext>-Send>d__5.MoveNext()
MT-Host-MachineName:    WIN-123456
MT-Host-ProcessName:    MyCompany.ProductCommandListener.WindowsService
MT-Host-ProcessId:  848
MT-Host-Assembly:   MyCompany.ProductCommandListener.WindowsService
MT-Host-AssemblyVersion:    1.0.0.0
MT-Host-MassTransitVersion: 3.5.4.992
MT-Host-FrameworkVersion:   4.0.30319.42000
MT-Host-OperatingSystemVersion: Microsoft Windows NT 6.2.9200.0
content_type:   application/vnd.masstransit+json

各メッセージは約 5000 バイトです。メッセージがどのようにタイムアウトになったかを理解したいと思います。ack の動作に関して、rabbitMQ の Web サイトでこれを見つけました。

For routable messages, the basic.ack is sent when a message has been accepted by all the queues. For persistent messages routed to durable queues, this means persisting to disk. For mirrored queues, this means that all mirrors have accepted the message. ( https://www.rabbitmq.com/confirms.html#when-publishes-are-confirmed )

ただし、フェデレーションでの公開確認動作に関する情報は見つかりませんでした。だから私たちの質問は

  1. Exchange フェデレーションでは、すべてのダウンストリーム サーバーがメッセージを受信したとき、またはアップストリーム サーバーがメッセージをディスクに永続化したときに、ブローカーは公開確認を送信しますか?
  2. タイムアウトエラーを解決するには?

どんな助けでも大歓迎です。

4

0 に答える 0