Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Переиспользование одного диалога для асинхронного выполнения процедур / 25 сообщений из 29, страница 1 из 2
17.12.2019, 17:38
    #39904252
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Всем привет!

Осваиваю ServiceBroker для асинхронного выполнения процедуры. Использую одну очередь и один диалог, получаю хендл диалога так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
       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: )

С уважением, Князев Константин
...
Рейтинг: 0 / 0
17.12.2019, 17:56
    #39904268
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Zelius,

Работающий диалог не обязательно всегда в CO
Я проверяю так - state not in (N'DO', N'DI', N'CD', N'ER')
...
Рейтинг: 0 / 0
17.12.2019, 23:36
    #39904404
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
invm,

Нет, состояние не причем, пробовал без него. Все равно пусто. Как будто запрос с ридпаст делается.
...
Рейтинг: 0 / 0
18.12.2019, 10:01
    #39904503
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Zelius,

Чудес не бывает.
...
Рейтинг: 0 / 0
18.12.2019, 10:21
    #39904521
Crimean
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
читайте state, сравнивайте явно и логируйте. получите ответ на свой вопрос.
...
Рейтинг: 0 / 0
18.12.2019, 11:35
    #39904578
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
логирую
Код: sql
1.
2.
3.
4.
5.
			set	@Text = (
				select	*
				from	sys.conversation_endpoints CEP with(nolock)
				for xml path('dialogs')
			)



пусто (

понятно, что чудес не бывает, но вот понять не могу что не так... может что пытаюсь переиспользовать диалог в разных сессиях?
...
Рейтинг: 0 / 0
18.12.2019, 11:47
    #39904593
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Zelius
пусто (
Как-то не очень соотносится с "диалог точно есть"
Как тогда определяете, что он есть?
...
Рейтинг: 0 / 0
18.12.2019, 11:52
    #39904600
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Zelius,

а в чем смысл экономии на диалогах? Даже если получится, вы создадите бутылочное горлышко. Я как-то экспериментировал с этим, результат неудовлетворительный.
...
Рейтинг: 0 / 0
18.12.2019, 11:55
    #39904603
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Владислав Колосов
Я как-то экспериментировал с этим, результат неудовлетворительный.
Видимо криво экспериментировали.
На создание-удаление диалога тратятся ресурсы и немалые.
...
Рейтинг: 0 / 0
18.12.2019, 12:14
    #39904613
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Zelius,

Один диалог? Так делать точно не стоит, надо делать пул.
  • Делаете табличку с полями порядкового номера диалога в пуле (от 1 до 200 например) и собственно conversation_handle. В довесок к ней делаете сиквенс, лучше с рециклом, по которому каждое соединение определяет, какой диалог использовать.
  • Я делал размер цикла сиквенса кратным размеру пула, например от 1 до 10000. В этом случае номер диалога определяется делением значения сиквенса по модулю размера пула (последний можно захардкодить, но лучше хранить в конфигурационной табличке, так гибше).
...
Рейтинг: 0 / 0
18.12.2019, 12:30
    #39904633
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
invm
Zelius
пусто (
Как-то не очень соотносится с "диалог точно есть"
Как тогда определяете, что он есть?

в SSMS выполняю скрипт и вижу, что появился новый диалог, хотя старый не исчез и в состоянии CO
...
Рейтинг: 0 / 0
18.12.2019, 12:33
    #39904634
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Ennor Tiegael
Zelius,

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

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

PS спасибо, буду иметь ввиду.
...
Рейтинг: 0 / 0
18.12.2019, 12:43
    #39904643
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
invm,

мне не устроило то, что писатели выстраивались в очередь ожидания. Это привело к огромным заторам, куда худшим, чем затраты на создание диалога. Если запись производится быстрыми транзакциями, тогда проблем, разумеется нет особых.
...
Рейтинг: 0 / 0
18.12.2019, 12:50
    #39904653
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
отказался от переиспользования диалога, т.к. он использовался из разный сессий и могли возникнуть ожидания завершения чужих транзакций и ошибки вследствии проблем отправки в других сессиях. пришел к выводу, что переиспользование диалога имеет смысл только в рамках одной сессии или без длительных транзакций.

но ответа на вопрос как может быть пустой sys.conversation_endpoints не нашел (
...
Рейтинг: 0 / 0
18.12.2019, 13:00
    #39904673
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Zelius,

на факт, что точка подключения в момент запроса не находилась в другом состоянии.
...
Рейтинг: 0 / 0
18.12.2019, 13:12
    #39904691
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Владислав Колосов,

а какое может быть состояние, если до запроса было CO и после тоже CO (по результатам отдельного запроса в студии)?
...
Рейтинг: 0 / 0
18.12.2019, 13:30
    #39904721
PaulYoung
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Zelius
invm
пропущено...
Как-то не очень соотносится с "диалог точно есть"
Как тогда определяете, что он есть?

в SSMS выполняю скрипт и вижу, что появился новый диалог, хотя старый не исчез и в состоянии CO
Старый диалог у вас не закрыт, потому и висит в состоянии CO
...
Рейтинг: 0 / 0
18.12.2019, 15:19
    #39904848
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
господа-хорошие,

перечитал весь пост 5 раз ничего не понял.
а у меня-то почему работает без проблем?
...
Рейтинг: 0 / 0
18.12.2019, 23:29
    #39905162
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
ShIgor,

Может нагрузка не большая?
...
Рейтинг: 0 / 0
19.12.2019, 09:31
    #39905245
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Zelius,

а какой критерий оценки нагрузки?
...
Рейтинг: 0 / 0
19.12.2019, 10:12
    #39905262
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Zelius,

это нормальная нагрузка? на название не обращайте внимания, очередь одна для всех.
полный размер лежит у меня на Google Drive
...
Рейтинг: 0 / 0
19.12.2019, 11:57
    #39905381
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
ShIgor,

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

PS оригинальная проблема у меня была в том, что select * from sys.conversation_endpoints был пустой, хотя диалоги точно были...
...
Рейтинг: 0 / 0
19.12.2019, 13:05
    #39905483
ShIgor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Zelius,

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

а изначально вопрос можно перефразировать так - "в кошельке пусто, хотя точно знаю - деньги есть"
sys.conversation_endpoints возвращает пустоту только если сами диалоги в другой базе.
...
Рейтинг: 0 / 0
19.12.2019, 14:36
    #39905579
Zelius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
ShIgor
Zelius,

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

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

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


Зы базу проверю, чем черт не шутит...
...
Рейтинг: 0 / 0
19.12.2019, 18:28
    #39905764
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Переиспользование одного диалога для асинхронного выполнения процедур
Zelius,

Права проверьте, в частности точно выясните, под какой именно учеткой делается тот селект, который не находит диалогов. Сервис брокер это просто гигантское минное поле в плане прав, упустить какой-нибудь неочевидный грант можно в куче мест.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Переиспользование одного диалога для асинхронного выполнения процедур / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]