powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Переиспользование одного диалога для асинхронного выполнения процедур
29 сообщений из 29, показаны все 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
Переиспользование одного диалога для асинхронного выполнения процедур
    #39905970
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael,

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

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

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

типа этого
Код: 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.
37.
38.
39.
40.
41.
42.
select 	
  sq.name queue_name, 
  ce.conversation_handle,
  case 
    when ce.is_initiator = 1 and (db.name is null) then '-->' -- far
    when ce.is_initiator = 1 and (db.name is not null) then '->' -- local
    when ce.is_initiator = 0 and (db.name is not null) then '<-' -- local
    when ce.is_initiator = 0 and (db.name is null) then '<--' -- far
    else 'n/a'
  end direction_sign,
  cast(choose(isnull(ce.is_initiator+1, 3), 'in', 'out', 'n/a') as nvarchar(3)) direction_txt,
  iif(
    ce.is_initiator = 1, 
    '(local) ', 
    iif(
      db.name is null, 
      '(remote ' + isnull(rt.name, '[no info]') COLLATE Cyrillic_General_CI_AS + ') ', 
      -- если вдруг rt.name is null то с диалогом что-то не то, вероятнее всего создали когда-то и бросили, а route удалили
      '(local) '
    )
  ) + se.name [from_service_or_route], 
  iif(
    ce.is_initiator = 0, 
    '(local) ', 
    iif(
      db.name is null, 
      '(remote '  + isnull(rt.name, '[no info]') COLLATE Cyrillic_General_CI_AS + ') ', 
      '(local) '
    ) 
  ) + ce.far_service [to_service_or_route],
  ce.state ce_state,  get_transmission_status(ce.conversation_handle) transmission_status,
  ce.send_sequence, ce.receive_sequence, ce.receive_sequence_frag,
  qm.last_activated_time -- время в UTC+0
  --qm.state, qm.tasks_waiting
from 
  sys.service_queues sq 
  inner join sys.service_queue_usages qu on qu.service_queue_id = sq.object_id
  inner join sys.services se on se.service_id = qu.service_id
  left join sys.dm_broker_queue_monitors qm on qm.queue_id = qu.service_queue_id
  left join sys.conversation_endpoints ce on ce.service_id = se.service_id 
  left join sys.routes rt on rt.broker_instance = ce.far_broker_instance and rt.remote_service_name = ce.far_service
  left join sys.databases db on db.service_broker_guid = ce.far_broker_instance


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

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


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