Настроить очередь для пользовательских сообщений о повторных попытках в Rebus

Мне удалось написать настраиваемую политику повтора, используя сервер sql в качестве хранилища отложенных сообщений. Но теперь по причинам масштабируемости я хотел бы запустить несколько рабочих (задач обработчика сообщений), развернутых на разных машинах. По этой причине я хотел бы иметь центральное место для чтения отложенных сообщений (например, из очереди), а не чтения с сервера sql.

Есть ли способ сохранить отложенные сообщения в очереди? Это лучший подход? Что было бы лучше для этого?


person Chathuri Gunawardhana    schedule 28.09.2017    source источник


Ответы (1)


Есть ли способ сохранить отложенные сообщения в очереди? Это лучший подход?

Не с очередями, с которыми я знаком :) Большинство очередей действительно хороши в fifo , что конфликтует с отложенными сообщениями, поскольку задержка может варьироваться для каждого сообщения (по крайней мере, в общем случае).

Желание получить доступ к сообщениям, упорядоченным потенциально очень отличным от порядка, в котором они были отправлены, делает базы данных со вторичными индексами довольно хорошей технологией для хранения отложенных сообщений.

Что было бы лучше для этого?

Однако я не уверен, что понимаю, что вы считаете неправильным в хранении отложенных сообщений в SQL Server.

Конечно, если у вас есть много конечных точек, откладывающих сообщения, вы можете использовать «внешний диспетчер тайм-аута» вместо того, чтобы каждая отдельная конечная точка опрашивала базу данных - это можно сделать, выполнив это в ваших конечных точках:

Configure.With(...)
    .(...)
    .Timeouts(t => t.UseExternalTimeoutManager("timeouts"))
    .Start();

а затем просто запустите конечную точку с настроенным хранилищем времени ожидания и входной очередью timeouts.

person mookid8000    schedule 28.09.2017
comment
Мне нравится решение иметь внешний диспетчер тайм-аута, и это то, что я искал (а не базу данных опроса каждого рабочего). Но могу ли я узнать, где работает этот внешний диспетчер тайм-аута? Если этот диспетчер тайм-аута выйдет из строя, выберут ли остальные работники другого диспетчера тайм-аута? - person Chathuri Gunawardhana; 29.09.2017
comment
Если диспетчер тайм-аута останавливается или выходит из строя без перезапуска, никакие конечные точки не получат свои отложенные сообщения. Новые отложенные сообщения просто помещаются в очередь timeouts. Диспетчер тайм-аута - это обычная конечная точка Rebus, которую вам нужно сделать. - person mookid8000; 29.09.2017
comment
Если вы используете центральную базу данных, например, SQL Server, и если вы используете какую-то систему очередей на основе брокера (например, RabbitMQ), довольно просто развернуть два экземпляра диспетчера тайм-аута на двух разных машинах для реализации избыточности. - person mookid8000; 29.09.2017
comment
Большое спасибо за подробное объяснение! - person Chathuri Gunawardhana; 29.09.2017