Сервіс-брокер - Термін розмови?


9

Ми намагаємось змусити Сервісного брокера працювати в нашому середовищі для вирішення ділової справи. Я не знаю, чи хороша назва повідомлення, але моє питання нижче. Але це може бути не надто хорошим питанням, тому після цього ми робимо те, чому я вважаю, що це правильне питання.

Скільки повідомлень слід надіслати на розмову, перш ніж закінчити розмову?

Ми хочемо скористатися Service Broker для асинхронного оновлення таблиці результатів. Таблиця результатів вирівняна і швидка. У базових таблицях є тригери, які надсилають повідомлення зі своєю таблицею та первинним ключем. У нас три черги:

  • Низька затримка - ціль - 15 секунд для обробки. Він обробляє елементи, які змінюються стосовно певного предмета.
  • Об'ємна черга - обробка полягає в 5 хвилин. Він обробляє, коли щось змінюється, що впливає на багато сотень (або тисяч) предметів. Він розбиває список предметів, на які постраждали, і подає їх до черги із відкладеною низькою затримкою
  • Відкладена низька затримка - ціль - 30 хвилин для обробки. Це обробляє елементи, але тільки з масової черги.

В основному, якщо інформація клієнта оновлюється; що впливає на багато продуктів, тому надсилається до масової черги для повільнішої обробки. Однак, якщо продукт оновлюється, він надсилається до черги з низькою затримкою.

Ми повторно використовуємо розмови, подібні до блогу Ремуса Русану http://rusanu.com/2007/04/25/reusing-conversations/ , за винятком того, що ми робимо це на основі модуля первинного ключа. Це має побічну перевагу в наданні допомоги в дедублюванні первинного ключа.

Таким чином, ми повторно використовуємо бесіди і перебуваємо в межах наших рекомендацій. За допомогою двох потоків я зміг пропустити 125 повідомлень / секунду (штучне падіння декількох тисяч повідомлень), що більш ніж здатне йти в ногу з виробництвом (приблизно 15 повідомлень / сек).

Однак проблема, з якою ми стикаємося, полягає в тому, що через певний проміжок часу, ~ 4 години або 120K повідомлень, ми почали бачити блоки та великі суперечки в Sysdesend та таблиці черг. Замки мають LCK_M_U і є ключами KEY. Іноді hobt вирішується до sysdesend, а в інший раз конкретної таблиці черг (queue_).

У нас є процес, який закінчить розмови вже через 24 години або 30 хвилин бездіяльності, тому ми могли просто збільшити час, перш ніж переходити до розмов.

Ми використовуємо SQL 2016 Enterprise (13.0.4001.0)

  1. Тригерні пожежі (надіслати або з низькою затримкою, або з масовою)
  2. Знайдіть або створіть ручку для розмови.
  3. відправити повідомлення
  4. Процедура, що активується в черзі
  5. Оновіть таблицю результатів

Процес очищення запускається кожні 10 хвилин, щоб перевірити, чи є бесіди в режимі очікування. якщо він знаходить їх більше трьох разів поспіль, він позначає це як неактивні і закінчує розмови.

Будь ласка, дайте мені знати, чи є якісь додаткові деталі, які можуть бути корисними. Я не маю великого досвіду роботи з Service Broker, тому не знаю, чи є наші повідомлення / сек низькими, високими чи байдужими.

ОНОВЛЕННЯ

Тому ми сьогодні спробували знову і зіткнулися з тією ж проблемою. Ми змінили життя розмови на 2 години, і це не мало ефекту. Тож ми реалізували трюк 150; які мали те саме питання.

Тон чекає на НАДІСЛОВУ ПОВЕРНЕННЯ, чекаючи на sysdesend. Хтось має якісь подальші ідеї?

ОНОВЛЕННЯ 2

Сьогодні ми провели тест довше, і за один із 17-ти типових періодів ми обробили 41K повідомлень на 4-х ручках для розмови. Нам вдалося не відставати, окрім кінця, коли замків на Sysdesend та таблиці черг стало занадто багато, і ми почали відходити перед тим, як зупинити його. У нас, здається, немає проблем з обробкою повідомлень, без речей, що потрапляють у чергу, ми можемо витягнути їх та обробити їх принаймні 5 разів із такою швидкістю. Здається, наша швидкість обмежена на основі додавання повідомлень.

На пізньому тесті ми видалили один з тригерів, на який припадало 80% повідомлень. Навіть при цьому значно зниженому навантаженні ми почали бачити однакові очікування.

ОНОВЛЕННЯ 3

Дякую, Ремус за пораду (і дякую, що ви опублікували такі чудові статті в блозі на цю тему, вони допомогли досягти цієї мети).

Ми побігли це сьогодні сьогодні і зробили краще (як ми пішли довше, перш ніж побачити очікування і навіть довше, перш ніж це покалічило нас). Отже, деталі.

Ми змінили: * Збільшено кількість підтримуваних розмов на потоку з 1: 1 до 2: 1. В основному у нас було 8 ручок для розмов на 4 теми.

  • консолідована об'ємна черга (оскільки одне вхідне повідомлення може означати сотні вихідних повідомлень) для консолідації в меншу кількість більших повідомлень.

Примітки щодо цієї спроби:

  • відключення процедури активації цільової черги. жодних змін у блокуванні (ми чекали 5 хвилин), і повідомлення надійшли на sys.transmission_queues.

  • моніторинг sys.conversation_endpoints. Це число швидко зросло від 0 13K, а потім повільніше зростало протягом дня, закінчуючи приблизно 25K через ~ 5 годин. Блокування не почалося, поки воно не досягло 16K +/-

  • Я зайшов у ЦАП і запустив команди DBREINDEX для черг, хоча з запиту записи про привидів ніколи не перевищували 200 або більше, перш ніж прибирали та зменшили кількість до 0.

  • Коли я закінчив тест, sysdesend і sysdercv мали однакові підрахунки 24 932.

  • ми обробили ~ 310K повідомлень за 5 годин.

Ми пішли так довго, перш ніж речі розпалися, що я справді думав, що ми цього разу встигнемо. Завтра ми спробуємо змусити повідомлення пройти по дроту.


1
we started seeing blocks and high contention on sysdesend and the queue table.-> Що таке тип очікування - PAGELATCH_EX/SH and WRITELOG? Ви використовували трюк 150 ? Якщо системні таблиці - це ваша суперечка, хитрість 150 буде дуже корисною.
Кін Шах

@kin, я оновив питання, але типи блокування - LCK_M_U або LCK_M_X. Я читав про хитрість 150, але сподівався, що це буде непотрібним у 2016 році (оскільки вони також вирішили проблему витоку tempdb), але також тому, що це схоже на такий злом. Ми збираємось зробити інший удар, коли йдемо на виробництво (ми, на жаль, стикаємося лише з цим виробничим навантаженням) і спробуємо спочатку розмовляти коротше життя. Я оновлю тут результати. Далі буде 150 фокус, на який ви посилаєтесь.
Джонатан Фійт

Я запитав @RemusRusanu у Twitter - він Експерт із сервісних брокерів :-)
Кін Шах

Це не те, що я бачив раніше (деградація SEND після тривалого часу). 1) скажіть, будь ласка, яка кількість рядків у sys.conversation_endpointsтесті (постійна або збільшується, і наскільки вона велика, коли відбувається блокування). 2) Якщо відбувається блокування, чи відключення цільової черги має значення в блокуванні SEND (відключення черги повинно направляти SEND на sys.transmission_queue). і 3) Примушення повідомлень переходити на провід, навіть локально (встановлювати SSB кінцеву точку, додавати маршрути) змінює поведінку в перспективі
Рем Русану

Ще кілька думок: 4) коли зупинка RECEIVE на цілі впливає (відключення активованого протоколу, якщо така є) та 5) скільки прихованих записів у цільовій черзі? Чи має значення біг, ALTER QUEUE ... REBUILDколи блокування починається?
Рем Русану

Відповіді:


3

Я знаю, що це погана форма відповіді на ваше власне питання, але я хотів закрити це для всіх, хто зацікавився. Нарешті нам вдалося вирішити проблему або принаймні вирішити її достатньо, щоб відповідати нашим вимогам. Хочу подякувати всім, хто написав коментарі; Ремус Русану та Кін, як вони були дуже корисними.

Наша база даних досить зайнята і знаходиться в режимі RCSI. У нас є кілька (тисяч) мобільних пристроїв, які оновлюють інформацію про своє місцезнаходження кожні 45 секунд. Завдяки цим оновленням декілька таблиць оновлюють свою інформацію (поганий дизайн, оскільки я б обмежив нестабільну інформацію однією таблицею, а потім долучив її до результатів). Ці таблиці є тими самими, які ми намагалися асинхронно генерувати інформацію про звітність, а не для того, щоб кінцеві користувачі йшли безпосередньо проти базових таблиць.

Ми спочатку мали тригери робити курсор над модифікованими записами у кожному операторі оновлення / вставки (у більшості випадків це повинен був бути один рядок) та надсилати кожен первинний ключ у повідомленні брокеру служби. Всередині сервісного брокера, особливо масової черги, були додаткові курсори, які виконували процедуру оновлення звіту (по одному виконанню за первинний ключ).

Що нарешті змусило нас працювати:

  • Ми видалили курсори і вирішили надсилати більші повідомлення. Ще одне повідомлення на транзакцію користувача за таблицею, але тепер ми надсилаємо повідомлення з більш ніж одним первинним ключем.

  • Об'ємний процесор також надсилає кілька клавіш на повідомлення, що зменшує кількість відправлених переговорів, які тривали, коли перетасовував повідомлення на іншу чергу, якщо це необхідно.

  • У найбільш мінливій таблиці (наша таблиця даних мобільних пристроїв) було знято тригери. Ми оновили процедуру оновлення, щоб включити відповідні зовнішні ключі, і тепер ми просто приєднуємося до цієї таблиці, коли отримуємо результати для користувачів. Ця таблиця легко сприяла 80% повідомлень, які нам доводилося обробляти за день.

Ми обробляємо ~ 1 млн повідомлень на день (без таблиці мобільних пристроїв), і переважна більшість (99% +) наших повідомлень обробляються в межах нашої мети. У нас все ще виникають випадкові випадковість, але враховуючи рідкісний характер того, що він вважається прийнятним.

Фактори, що сприяють:

  • У попередній процедурі очищення розмови я виявив помилку, яка фактично не чистила розмови належним чином і передчасно закінчувала їх. Це призвело до того, що кількість наших системних переказів ніколи не перевищуватиме декілька тисяч (більша частина цього припадає на використання трюку 150).

  • Курсори в спускових механізмах, схоже, утримують більше блокування, ніж передбачалося (навіть зі статичним, вперед-тільки). видалення цих даних, можливо, зробило замовлення, які ми бачимо у ВІДПОВІДНІЙ ПЕРЕВІРІ, більш перехідними за своєю суттю (або принаймні рази, які ми бачимо, значно нижчі).

  • Ми по суті працювали над двома рішеннями (резервний сервіс для сервісного брокера (для тестування під виробничим навантаженням)) та поточним рішенням (жахливий запит, який охоплює багато таблиць).

Як побічна перевага, це виявило проблему очищення записів Ghost Record, і, хоча вона не була в таблицях Service Broker (система чи черга), вона досить сильно розгулюється в нашій системі, і симптоми справді добре узгоджуються з нашою "відсутністю явної причини". проблеми, які ми відчуваємо часом. Продовжується розслідування цього питання, ми намагаємось знайти таблиці, які їм сприяють, і ми, ймовірно, просто регулярно відновлюємо їх індекси.

Ще раз дякую


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.