在Service Fabric中与两个或多个有状态服务共享队列

时间:2016-12-18 10:54:36

标签: c# azure-service-fabric service-fabric-stateful

是否可以在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();
            }
        }
    }
}

然后我的第二个服务从该队列中读取,然后继续处理。

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但是我没有看到关于它是如何工作的例子,或者你甚至可以做跨服务?

这背后的想法是将处理拆分为单独的队列,以便在我们尝试重新尝试消息时不会处于不一致状态。

1 个答案:

答案 0 :(得分:2)

没有办法在服务之间共享状态。 statemanager作用于服务分区级别。

您可以使用外部队列来实现此目的,例如Service Bus。

您还可以使用Event Driven方法反转控制。服务1将引发一个事件,服务2将用作继续处理的触发器。要处理的数据可以在事件内部,也可以存储在另一个位置的数据中,从事件中引用。