Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1419
Всем привет!

Осваиваю ServiceBroker для асинхронного выполнения процедуры. Использую одну очередь и один диалог, получаю хендл диалога так
       declare       @Handle                    uniqueidentifier
             ,      @LockResult         int
 
       begin transaction
 
             select @Handle      = CEP.conversation_handle
             from   sys.conversation_endpoints CEP
             where  CEP.far_service = 'EventService'
                           and CEP.state = 'CO'
                           and CEP.is_initiator = 1
 
             if     @Handle is null 
             begin
                    exec @LockResult = sp_getapplock
                                  @Resource           = 'EventAsync_Lock'
                           ,      @LockMode           = 'Exclusive'
 
                    if     @LockResult < 0
                           ;throw...
 
                    -- вдруг конкурирующий процесс уже создал диалог
                    select @Handle      = CEP.conversation_handle
                    from   sys.conversation_endpoints CEP
                    where  CEP.far_service = 'EventService'
                                  and CEP.state = 'CO'
                                  and CEP.is_initiator = 1
 
                    if     @Handle      is null
                           begin dialog conversation @Handle
                           from service EventService to service 'EventService', 'current database'
                           with encryption = off;
             end
 
             ;send on conversation @Handle (@Event)
 
       commit

Все работает на стейдже, но на проде возникла проблема - иногда запрос из sys.conversation_endpoints ничего не возвращал, хотя диалог точно есть! И создавался новый диалог.

Никто не сталкивался, как лечиьт?

ЗЫ Microsoft SQL Server 2017 (RTM-CU17) (KB4515579) - 14.0.3238.1 (X64)
Sep 13 2019 15:49:57
Copyright (C) 2017 Microsoft Corporation
Enterprise Edition: Core-based Licensing (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: )

С уважением, Князев Константин
17 дек 19, 17:38    [22042405]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
Zelius,

Работающий диалог не обязательно всегда в CO
Я проверяю так - state not in (N'DO', N'DI', N'CD', N'ER')
17 дек 19, 17:56    [22042430]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1419
invm,

Нет, состояние не причем, пробовал без него. Все равно пусто. Как будто запрос с ридпаст делается.
17 дек 19, 23:36    [22042640]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
Zelius,

Чудес не бывает.
18 дек 19, 10:01    [22042788]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Crimean
Member

Откуда:
Сообщений: 13148
читайте state, сравнивайте явно и логируйте. получите ответ на свой вопрос.
18 дек 19, 10:21    [22042813]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1419
логирую
			set	@Text = (
				select	*
				from	sys.conversation_endpoints CEP with(nolock)
				for xml path('dialogs')
			)


пусто (

понятно, что чудес не бывает, но вот понять не могу что не так... может что пытаюсь переиспользовать диалог в разных сессиях?
18 дек 19, 11:35    [22042893]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
Zelius
пусто (
Как-то не очень соотносится с "диалог точно есть"
Как тогда определяете, что он есть?
18 дек 19, 11:47    [22042912]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
Zelius,

а в чем смысл экономии на диалогах? Даже если получится, вы создадите бутылочное горлышко. Я как-то экспериментировал с этим, результат неудовлетворительный.
18 дек 19, 11:52    [22042919]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
invm
Member

Откуда: Москва
Сообщений: 9115
Владислав Колосов
Я как-то экспериментировал с этим, результат неудовлетворительный.
Видимо криво экспериментировали.
На создание-удаление диалога тратятся ресурсы и немалые.
18 дек 19, 11:55    [22042925]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3141
Zelius,

Один диалог? Так делать точно не стоит, надо делать пул.
  • Делаете табличку с полями порядкового номера диалога в пуле (от 1 до 200 например) и собственно conversation_handle. В довесок к ней делаете сиквенс, лучше с рециклом, по которому каждое соединение определяет, какой диалог использовать.
  • Я делал размер цикла сиквенса кратным размеру пула, например от 1 до 10000. В этом случае номер диалога определяется делением значения сиквенса по модулю размера пула (последний можно захардкодить, но лучше хранить в конфигурационной табличке, так гибше).
18 дек 19, 12:14    [22042939]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1419
invm
Zelius
пусто (
Как-то не очень соотносится с "диалог точно есть"
Как тогда определяете, что он есть?

в SSMS выполняю скрипт и вижу, что появился новый диалог, хотя старый не исчез и в состоянии CO
18 дек 19, 12:30    [22042966]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1419
Ennor Tiegael
Zelius,

Один диалог? Так делать точно не стоит, надо делать пул.
  • Делаете табличку с полями порядкового номера диалога в пуле (от 1 до 200 например) и собственно conversation_handle. В довесок к ней делаете сиквенс, лучше с рециклом, по которому каждое соединение определяет, какой диалог использовать.
  • Я делал размер цикла сиквенса кратным размеру пула, например от 1 до 10000. В этом случае номер диалога определяется делением значения сиквенса по модулю размера пула (последний можно захардкодить, но лучше хранить в конфигурационной табличке, так гибше).

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

PS спасибо, буду иметь ввиду.
18 дек 19, 12:33    [22042967]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
invm,

мне не устроило то, что писатели выстраивались в очередь ожидания. Это привело к огромным заторам, куда худшим, чем затраты на создание диалога. Если запись производится быстрыми транзакциями, тогда проблем, разумеется нет особых.
18 дек 19, 12:43    [22042978]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Zelius
Member

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

но ответа на вопрос как может быть пустой sys.conversation_endpoints не нашел (
18 дек 19, 12:50    [22042990]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7383
Zelius,

на факт, что точка подключения в момент запроса не находилась в другом состоянии.
18 дек 19, 13:00    [22043015]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1419
Владислав Колосов,

а какое может быть состояние, если до запроса было CO и после тоже CO (по результатам отдельного запроса в студии)?
18 дек 19, 13:12    [22043037]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2548
Zelius
invm
пропущено...
Как-то не очень соотносится с "диалог точно есть"
Как тогда определяете, что он есть?

в SSMS выполняю скрипт и вижу, что появился новый диалог, хотя старый не исчез и в состоянии CO
Старый диалог у вас не закрыт, потому и висит в состоянии CO
18 дек 19, 13:30    [22043083]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2298
господа-хорошие,

перечитал весь пост 5 раз ничего не понял.
а у меня-то почему работает без проблем?
18 дек 19, 15:19    [22043273]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1419
ShIgor,

Может нагрузка не большая?
18 дек 19, 23:29    [22043734]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2298
Zelius,

а какой критерий оценки нагрузки?
19 дек 19, 09:31    [22043888]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2298
Zelius,

это нормальная нагрузка? на название не обращайте внимания, очередь одна для всех.
+ полный размер
лежит у меня на Google Drive


К сообщению приложен файл. Размер - 118Kb


Сообщение было отредактировано: 19 дек 19, 10:14
19 дек 19, 10:12    [22043917]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1419
ShIgor,

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

PS оригинальная проблема у меня была в том, что select * from sys.conversation_endpoints был пустой, хотя диалоги точно были...
19 дек 19, 11:57    [22044084]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
ShIgor
Member

Откуда: Нижний Новгород
Сообщений: 2298
Zelius,

нет, не самописное. типа PowerBI, Таблю и т.п.

а изначально вопрос можно перефразировать так - "в кошельке пусто, хотя точно знаю - деньги есть"
sys.conversation_endpoints возвращает пустоту только если сами диалоги в другой базе.
19 дек 19, 13:05    [22044234]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Zelius
Member

Откуда: Россия, Москва
Сообщений: 1419
ShIgor
Zelius,

нет, не самописное. типа PowerBI, Таблю и т.п.

а изначально вопрос можно перефразировать так - "в кошельке пусто, хотя точно знаю - деньги есть"
sys.conversation_endpoints возвращает пустоту только если сами диалоги в другой базе.

Скорее как открыл кошелек, смотрю деньги лежат, закрыл, опять открыл смотрю пусто, положил еще денег, закрыл, открыл - смотрю и старые и новые лежат.


Зы базу проверю, чем черт не шутит...
19 дек 19, 14:36    [22044367]     Ответить | Цитировать Сообщить модератору
 Re: Переиспользование одного диалога для асинхронного выполнения процедур  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3141
Zelius,

Права проверьте, в частности точно выясните, под какой именно учеткой делается тот селект, который не находит диалогов. Сервис брокер это просто гигантское минное поле в плане прав, упустить какой-нибудь неочевидный грант можно в куче мест.
19 дек 19, 18:28    [22044643]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить