Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Service Broker для репликации / 25 сообщений из 179, страница 1 из 8
12.04.2020, 18:45
    #39946380
Максим Александровитч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Добрый день.
Есть 2 разных сервера,оба на линуксе

Необходимо настроить между ними обмен сообщениями путем брокера.
Оба сервера Developer's edition

Сделал по статье
https://www.sql.ru/forum/1284421-1/kak-obnaruzhit-oshibku-pri-rabote-service-broker

В итоге посылаю в очередь
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE @h UNIQUEIDENTIFIER;
BEGIN DIALOG CONVERSATION @h
FROM SERVICE Service1 TO SERVICE 'Service2'
ON CONTRACT DemoContract
WITH ENCRYPTION = OFF;
SEND ON CONVERSATION @h MESSAGE TYPE
DemoMessageType ('test message from server 1');
END CONVERSATION @h;


Но на другом сервере не могу извлечь..
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DECLARE @h UNIQUEIDENTIFIER, @msg VARCHAR(MAX);
BEGIN TRANSACTION;
 WAITFOR (
 RECEIVE TOP (1) @h = [conversation_handle]
 , @msg = TRY_CONVERT(varchar, [message_body])
 FROM [Queue2]
 ), TIMEOUT 1000
 IF @@ROWCOUNT <= 0 BEGIN
 PRINT 'No messages'
 ROLLBACK TRANSACTION;
 RETURN;
 END;
 PRINT @msg
 END CONVERSATION @h;
COMMIT TRANSACTION;

(затронуто строк: 0)
No messages


Подскажите,кто может..в чем ошибка?Почему я не вижу отправленного сообщения?
...
Рейтинг: 0 / 0
12.04.2020, 20:37
    #39946413
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Максим Александровитч,

Вы проверяли содержимое sys.transmission_queue на обоих серверах?

Ну и конечно sys.conversation_endpoints, чтоб 2 раза не вставать.
...
Рейтинг: 0 / 0
12.04.2020, 20:58
    #39946418
Максим Александровитч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Ennor Tiegael
Максим Александровитч,

Вы проверяли содержимое sys.transmission_queue на обоих серверах?

Ну и конечно sys.conversation_endpoints, чтоб 2 раза не вставать.


Хм..пусто
...
Рейтинг: 0 / 0
13.04.2020, 03:28
    #39946473
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Максим Александровитч,


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

если не видете сообщений в очереди то проверьте
а) sys.databases на наличие is_broker_enabled
б) на сервере источнике sys.transmission_queue
в) саму очередь отправки на наличие сообщений

в каком либо из шагов будет информация о ошибке.
еще sys.dm_broker_connections на установление вероятной ошибки транспорта
...
Рейтинг: 0 / 0
13.04.2020, 05:26
    #39946475
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Максим Александровитч
Ennor Tiegael
Максим Александровитч,

Вы проверяли содержимое sys.transmission_queue на обоих серверах?

Ну и конечно sys.conversation_endpoints, чтоб 2 раза не вставать.


Хм..пусто
Т.е. вы выполняете BEGIN DIALOG, после чего шлете в него сообщение, и у вас нет ни ошибок, ни записей в sys.conversation_endpoints? Убедитесь, что смотрите в контексте правильной БД, и что вы sysadmin.
...
Рейтинг: 0 / 0
13.04.2020, 07:54
    #39946485
Максим Александровитч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Ennor Tiegael
Максим Александровитч
пропущено...


Хм..пусто
Т.е. вы выполняете BEGIN DIALOG, после чего шлете в него сообщение, и у вас нет ни ошибок, ни записей в sys.conversation_endpoints? Убедитесь, что смотрите в контексте правильной БД, и что вы sysadmin.


Я скажу,более,я только что создал эти БД..
Смотрю,разумеется в контексте нужной и конечно я админ..
Есть ли еще какие-то решения на эту тему?
...
Рейтинг: 0 / 0
13.04.2020, 09:00
    #39946491
Максим Александровитч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
felix_ff
Максим Александровитч,


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

если не видете сообщений в очереди то проверьте
а) sys.databases на наличие is_broker_enabled
б) на сервере источнике sys.transmission_queue
в) саму очередь отправки на наличие сообщений

в каком либо из шагов будет информация о ошибке.
еще sys.dm_broker_connections на установление вероятной ошибки транспорта



а) sys.databases на наличие is_broker_enabled - да,включен
б)В очереди передачи есть строки,есть to_service_name,но нет поля to_broker_instance пустые.
Message_body заполнено.
Тут

select *
from sys.conversation_endpoints
Статус Do
На что обратить внимание?
...
Рейтинг: 0 / 0
13.04.2020, 10:09
    #39946508
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Упс...
...
Рейтинг: 0 / 0
13.04.2020, 10:19
    #39946511
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Максим Александровитч
Тут

select *
from sys.conversation_endpoints
Статус Do
Уже лучше, однако: https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-conversation-endpoints-transact-sql DO Disconnected outbound. The local side of the conversation has issued an END CONVERSATION. The conversation remains in this state until the remote side of the conversation acknowledges the END CONVERSATION. An application cannot send or receive messages for the conversation. When the remote side of the conversation acknowledges the END CONVERSATION, the conversation moves to the CD (Closed) state.Я правильно понимаю, что вы отправляете сообщение в диалог и тут же делаете ему END CONVERSATION? Не делайте так, никогда. Если вы хотите закрывать диалоги, то сей процесс должен инициироваться получателем, только после того, как тот получил все, что хотел. После этого инициатор получает на своей стороне системное сообщение EndDialog и закрывает диалог у себя.
...
Рейтинг: 0 / 0
13.04.2020, 10:37
    #39946522
Максим Александровитч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Ennor Tiegael
Максим Александровитч
Тут

select *
from sys.conversation_endpoints
Статус Do
Уже лучше, однако: https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-conversation-endpoints-transact-sql DO Disconnected outbound. The local side of the conversation has issued an END CONVERSATION. The conversation remains in this state until the remote side of the conversation acknowledges the END CONVERSATION. An application cannot send or receive messages for the conversation. When the remote side of the conversation acknowledges the END CONVERSATION, the conversation moves to the CD (Closed) state.
Я правильно понимаю, что вы отправляете сообщение в диалог и тут же делаете ему END CONVERSATION? Не делайте так, никогда. Если вы хотите закрывать диалоги, то сей процесс должен инициироваться получателем, только после того, как тот получил все, что хотел. После этого инициатор получает на своей стороне системное сообщение EndDialog и закрывает диалог у себя.

Так..да,вижу что делал
END CONVERSATION @h;
...
Рейтинг: 0 / 0
13.04.2020, 10:39
    #39946523
Максим Александровитч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Максим Александровитч
Ennor Tiegael
пропущено...
Уже лучше, однако:пропущено...
Я правильно понимаю, что вы отправляете сообщение в диалог и тут же делаете ему END CONVERSATION? Не делайте так, никогда. Если вы хотите закрывать диалоги, то сей процесс должен инициироваться получателем, только после того, как тот получил все, что хотел. После этого инициатор получает на своей стороне системное сообщение EndDialog и закрывает диалог у себя.


Так..да,вижу что делал
END CONVERSATION @h;


так перешел в стадию CO
state_desc = conversion
Но на получаетеле,все равно нет
...
Рейтинг: 0 / 0
13.04.2020, 11:18
    #39946540
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Ennor Tiegael,

Код: sql
1.
Я правильно понимаю, что вы отправляете сообщение в диалог и тут же делаете ему END CONVERSATION? Не делайте так, никогда.



Не совсем верно, если передача предполагается в одностороннем порядке, то нарушений логики или требований документации в этом нет. Передающий сторона выполняет два действия. Первое - отправляет "полезное" сообщение, второе, при закрытии диалога, автоматически отправляет системное сообщение [ http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog%5D]http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog] и закрывает диалог со своей стороны. Принимающая сторона должна обработать оба типа сообщения и, при получении сообщения с типом EndDialog закрыть диалог на своей стороне.
...
Рейтинг: 0 / 0
13.04.2020, 11:19
    #39946541
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Максим Александровитч,

Копайте sys.transmission_queue на обоих концах диалога, и также загляните в логи серверов. Не уверен насчет последних версий, но раньше ошибки транспортного уровня протоколировались там.

А, ну и вам уже советовали sys.dm_broker_connections
...
Рейтинг: 0 / 0
13.04.2020, 11:24
    #39946544
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Владислав Колосов
Не совсем верно, если передача предполагается в одностороннем порядке, то нарушений логики или требований документации в этом нет.
Читайте до полного понимания - https://rusanu.com/2014/03/31/how-to-prevent-conversation-endpoint-leaks/
...
Рейтинг: 0 / 0
13.04.2020, 11:28
    #39946547
Ennor Tiegael
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Владислав Колосов,

Я знаю, что обычно односторонняя отправка работает нормально, но в ранних версиях, на 2005 в частности, это иногда приводило к проблемам. Каким именно, сейчас боюсь уже не вспомню, за давностью лет.

ЗЫ Вот и дядюшка Римус тоже не рекомендует :авторThe fire-and-forget message exchange pattern is all too compelling, but it is riddled with problems. Ending the conversation from the target side is a much better approach.
...
Рейтинг: 0 / 0
13.04.2020, 11:46
    #39946550
Максим Александровитч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Все здорово,у вас дискуссия.
Так мне-то куда копать?
...
Рейтинг: 0 / 0
13.04.2020, 11:57
    #39946555
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Максим Александровитч,

В профайлере есть категория событий "Service Broker". Настройте трассу и мониторьте происходящее.
...
Рейтинг: 0 / 0
13.04.2020, 12:08
    #39946561
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Также имеется консольный вариант монитора за процессами брокера и средство диагностики. Курите мануалы. Может на линуксе это вообще не работает.
...
Рейтинг: 0 / 0
13.04.2020, 12:20
    #39946570
Максим Александровитч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Владислав Колосов
Также имеется консольный вариант монитора за процессами брокера и средство диагностики. Курите мануалы. Может на линуксе это вообще не работает.


А как понять что не работает на линуксе-то?
Я положил в канал,вижу что ждет обработки.
А есть метод реализации не на сертификате?
...
Рейтинг: 0 / 0
13.04.2020, 12:25
    #39946573
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Максим Александровитч,

у MS было где-то написано, что не работает на Линуксе. На странице скачивания, что ли. Не припомню, чтобы были ограничения на межсерверный брокер, но это не достоверно.
...
Рейтинг: 0 / 0
13.04.2020, 12:36
    #39946576
Максим Александровитч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Владислав Колосов
Максим Александровитч,

у MS было где-то написано, что не работает на Линуксе. На странице скачивания, что ли. Не припомню, чтобы были ограничения на межсерверный брокер, но это не достоверно.



Речь про Express версию..
И то он может работать как приемник
У меня Developers edition
...
Рейтинг: 0 / 0
13.04.2020, 17:37
    #39946687
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Максим Александровитч,

линуксовой версии под рукой нет, поэтому со стопроцентной гарантией утверждать не могу.

вы когда открыли диалог и отправили сообщение получателю покажите:
Код: sql
1.
2.
--на сервере источнике
select * from sys.dm_broker_connections


Код: sql
1.
2.
--на сервере получателе
select * from sys.dm_broker_connections




Код: sql
1.
2.
3.
--на сервере источнике:
use [source_db_name] --заменить на имя своей базы источника
select * from sys.transmission_queue;



Код: sql
1.
2.
3.
--на сервере получателе:
use msdb;
select * from sys.tranmission_queue;



add:
Код: sql
1.
2.
bla bla bla
end conversation @h;


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

адд2:
а еще забыл:
Код: sql
1.
2.
--на обоих инстансах
select * from sys.routes
...
Рейтинг: 0 / 0
13.04.2020, 17:46
    #39946688
Максим Александровитч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
felix_ff
Максим Александровитч,

линуксовой версии под рукой нет, поэтому со стопроцентной гарантией утверждать не могу.

вы когда открыли диалог и отправили сообщение получателю покажите:
Код: sql
1.
2.
3.
--на сервере источнике
select * from sys.dm_broker_connections
Там табла большая..что конкретное может выложить?


Код: sql
1.
2.
3.
--на сервере получателе
select * from sys.dm_broker_connections
Там табла большая..что конкретное может выложить?




Код: sql
1.
2.
3.
4.
--на сервере источнике:
use [source_db_name] --заменить на имя своей базы источника
select * from sys.transmission_queue;
Там табла большая..что конкретное может выложить?



Код: sql
1.
2.
3.
4.
--на сервере получателе:
use msdb;
select * from sys.tranmission_queue;
Пусто



add:
Код: sql
1.
2.
3.
4.
bla bla bla
end conversation @h;

Понял


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

адд2:
а еще забыл:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
--на обоих инстансах
select * from sys.routes

Получатель
name	route_id	principal_id	remote_service_name	broker_instance	lifetime	address	mirror_address
Service1Route	65537	1	Service1	C686869B-CA80-42BA-AC37-ECF57495DCDD	NULL	TCP://10.0.40.49:4022	NULL

Иницииатор
name	route_id	principal_id	remote_service_name	broker_instance	lifetime	address
Service2Route	65537	1	Service2	6644E17A-9898-4461-AF45-6F4F770F79F5	NULL	TCP://10.0.40.248:4022

...
Рейтинг: 0 / 0
13.04.2020, 17:52
    #39946690
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
Максим Александровитч,

Код: sql
1.
2.
3.
на сервере источнике: 
cmd =>
telnet 10.0.40.248 4022



Код: sql
1.
2.
3.
на сервере получателе:
cmd =>
telnet 10.0.40.49 4022



телнет проходит?
...
Рейтинг: 0 / 0
13.04.2020, 17:56
    #39946692
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Service Broker для репликации
felix_ff
Максим Александровитч,

линуксовой версии под рукой нет, поэтому со стопроцентной гарантией утверждать не могу.

вы когда открыли диалог и отправили сообщение получателю покажите:
--на сервере источнике
select * from sys.dm_broker_connections
Там табла большая..что конкретное может выложить?

--на сервере получателе
select * from sys.dm_broker_connections
Там табла большая..что конкретное может выложить?



--на сервере источнике:
use [source_db_name] --заменить на имя своей базы источника
select * from sys.transmission_queue;
Там табла большая..что конкретное может выложить?



конкретно у вас есть conversation_handle сохраненный в переменной @h при открытии диалога.
найдите по нему в sys.transmission_queue источника сообщение и покажите его текст
Код: sql
1.
select try_cast(message_body as xml), transmission_status from sys.transmission_queue where conversation_handle = @h;




в dm_broker_connections нас интересует несколько последних открытых соединений их статус:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select top (10) 
state_desc,
connect_time,
authentication_method,
principal_name,
remote_user_name,
login_state,
is_accept,
sends_posted,
total_sends
from sys.dm_broker_connections 
where is_accept = 0
order by connect_time desc
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Service Broker для репликации / 25 сообщений из 179, страница 1 из 8
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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