2 つ以上のステートフル サービス間でキューを共有することは可能ですか?それとも、メッセージを独自の内部キューに入れるために tcp/http 経由でキューを直接呼び出す必要がありますか?
例えば; 条件に基づいてキューに注文を入れる最初のサービスがあるとします。
public sealed class Service1 : StatefulService
{
public Service1(StatefulServiceContext context, IReliableStateManagerReplica reliableStateManagerReplica)
: base(context, reliableStateManagerReplica)
{ }
protected override async Task RunAsync(CancellationToken cancellationToken)
{
var customerQueue = await this.StateManager.GetOrAddAsync<IReliableQueue<Order>>("orders");
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
using (var tx = this.StateManager.CreateTransaction())
{
if (true /* some logic here */)
{
await customerQueue.EnqueueAsync(tx, new Order());
}
await tx.CommitAsync();
}
}
}
}
次に、2 番目のサービスがそのキューから読み取り、処理を続行します。
public sealed class Service2 : StatefulService
{
public Service2(StatefulServiceContext context, IReliableStateManagerReplica reliableStateManagerReplica)
: base(context, reliableStateManagerReplica)
{ }
protected override async Task RunAsync(CancellationToken cancellationToken)
{
var customerQueue = await this.StateManager.GetOrAddAsync<IReliableQueue<Order>>("orders");
while (true)
{
cancellationToken.ThrowIfCancellationRequested();
using (var tx = this.StateManager.CreateTransaction())
{
var value = await customerQueue.TryDequeueAsync(tx);
if (value.HasValue)
{
// Continue processing the order.
}
await tx.CommitAsync();
}
}
}
}
これに関するドキュメント内ではあまり見ることができません。GetOrAddAsync
メソッドが uri を受け取ることができることはわかりますが、これがどのように機能するか、またはクロスサービスを実行できるかどうかの例を見たことはありませんか?
この背後にある考え方は、処理を別々のキューに分割して、メッセージを再試行するときに矛盾した状態にならないようにすることです。