Лучше обрабатывать MessagingEntityNotFoundException или я должен проверить наличие темы перед отправкой сообщения
В примере кода в документации для Microsoft ServiceBus используется следующий код, чтобы убедиться, что тема существует.
// Create the topic if it does not exist already
string connectionString = CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");
var namespaceManager =
NamespaceManager.CreateFromConnectionString(connectionString);
if (!namespaceManager.TopicExists("TestTopic"))
{
namespaceManager.CreateTopic("TestTopic");
}
Но я хочу знать, как дорого TopicExists
Звонить будет, если я поставлю этот код перед отправкой сообщения. (предположим, что я не хочу иметь код инициализации отдельно)
Альтернативный подход заключается в том, чтобы быть оптимистичным и отправлять сообщения без проверки существования темы и обработки MessagingEntityNotFoundException
, В случае исключения мы можем создать тему и повторить отправку сообщения.
Второй подход кажется мне лучше, но я не смог найти никаких ссылок, поддерживающих его. Поэтому я хочу знать, есть ли конкретная причина, по которой Microsoft в своей документации и примерах выбрала первый подход, а не обработку исключения.
1 ответ
Нужно иметь в виду, что вам нужно управлять разрешениями для шины, чтобы создать тему. Возможно, вы не захотите предоставлять этот уровень разрешений всем своим клиентам, поскольку это может представлять определенную угрозу безопасности, например, клиент может создать подписку для чтения сообщений, которые он не должен видеть.
Вызов TopicExists() перед открытием клиентского соединения не очень дорогой и приведет к созданию более изящного кода. Если вы ждете исключения, прежде чем что-то создавать, вы можете обнаружить, что у вас в руках множество неудачных сообщений.
У меня обычно есть отдельный процесс создания и обновления структуры шины. Насколько это практично, зависит от того, сколько тем и очередей вы создаете.