Можно ли разделить очередь между двумя или более службами с отслеживанием состояния или мне нужно напрямую вызывать ее через 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();
}
}
}
}
Затем моя вторая служба читает из этой очереди, а затем продолжает обработку.
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, но я не видел примеров того, как это работает, или можете ли вы вообще выполнять кросс-сервисы?
Идея, стоящая за этим, состоит в том, чтобы разделить обработку на отдельные очереди, чтобы мы не попадали в несогласованное состояние, когда пытаемся повторить сообщение.