Совместное использование очереди с двумя или более службами с отслеживанием состояния в Service Fabric

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

Идея, стоящая за этим, состоит в том, чтобы разделить обработку на отдельные очереди, чтобы мы не попадали в несогласованное состояние, когда пытаемся повторить сообщение.


person Kevin Smith    schedule 18.12.2016    source источник


Ответы (1)


Невозможно разделить состояние между службами. диспетчер состояний действует на уровне служебного раздела.

Для этой цели можно использовать внешнюю очередь, например служебную шину.

Вы также можете инвертировать управление, используя подход управляемый событиями. Служба 1 вызовет событие, которое Служба 2 будет использовать в качестве триггера для продолжения обработки. Данные для обработки могут находиться внутри события или храниться в другом месте, на которое ссылается событие.

person LoekD    schedule 20.12.2016
comment
Да, это выглядело так, совсем как паб/саб по сравнению с подходом, основанным на командах. Спасибо за разъяснения. - person Kevin Smith; 20.12.2016