2017-02-18 21 views
3

Я только начинаю использовать Azure ServiceBus. Мне не все ясно, и мне трудно найти ответ.Azure ServiceBus: все темы подписчики должны обрабатывать сообщение

Если я звоню message.Complete() в подписное сообщение, означает ли это, что это сообщение больше не будет доставляться никаким другим абонентам, или я только завершу это сообщение для текущего абонента? Другими словами, обслуживающая шина отслеживает сообщения на абонента или на подписку?

В моем конкретном случае использования, я бы хотел, чтобы сообщение было обработано всех абонентов, а не просто любых/один абонентом. Это вообще возможно с темами?

ответ

3

Сообщения предназначен для обработки одного конкурирующего потребителем. В противном случае это будет рассматриваться как дублирование сообщений.

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

Например: при использовании облачных сервисов вам необходимо создать подписчика на экземпляр роли CS. Каждая очередь подписки должна быть однозначно идентифицируемой, а уникальный идентификатор должен быть детерминированным. Один из вариантов - либо использовать идентификатор экземпляра CS. Всякий раз, когда процесс масштабируется, идентификатор экземпляра будет добавлен к очереди подписки. С этим подходом есть и проблема. Когда процесс масштабируется, могут быть оставлены необработанные сообщения.

1

Так что, по-видимому, это невозможно. Подписчики одной и той же подписки соревнуются за обработку сообщения и не могут обрабатывать одно и то же сообщение. Для этого требуются отдельные подписки.

Этот вопрос более или менее дубликат Azure Service Bus - subscribers can independently subscribe to a subscription and share the same message?

5

Ваш вопрос уже был дан в ответе, но похоже, что есть путаница в терминах (подписка \ подписчик) и в чем смысл использования.

Рассмотрите простую очередь, где в одном конце вы помещаете сообщения, а на другом конце вы их наносите. Так поступает очередь ServiceBus.
Теперь рассмотрим очередь, в которой вы по-прежнему размещаете сообщения в одном конце, но затем делится на несколько концов, из которых вы можете отправлять сообщения. Здесь описывается тема (где вы помещаете сообщения) и подписку (где вы публикуете сообщения).

В теме \ подписка сообщения в теме скопированы на подписку. Таким образом, каждая подписка не зависит от другой подписки. Это похоже на другую копию очереди.

Теперь ваши клиентские приложения, получающие сообщения от подписки, вы называете подписчиками. Каждый клиент (абонент) предназначен для подключения к одной подписке. В этом случае абоненты не конкурируют за сообщения, и каждый абонент может обрабатывать то же сообщение, что и другие.

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

Надеюсь, это объясняло полученные вами ответы (которые, как представляется, противоречат друг другу, но на самом деле используют одни и те же термины по-разному). В конечном итоге вы можете сделать оба сценария с ServiceBus.