powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Переиспользование одного диалога для асинхронного выполнения процедур
25 сообщений из 29, страница 1 из 2
Переиспользование одного диалога для асинхронного выполнения процедур
    #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
Переиспользование одного диалога для асинхронного выполнения процедур
    #39904268
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius,

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

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

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



пусто (

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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