🇬🇧 English | 🇺🇦 Українська
13. Поширені запитання¶
Короткі відповіді на те, що запитують найчастіше, з посиланням на розділ, де кожне питання розібрано докладно. Якщо відповідь тут суперечить розділу — правий розділ.
Початок роботи¶
Скільки нод потрібно, щоб опублікувати перше повідомлення?¶
Три виклики:
Get Game Instance Subsystem (Nats Client Subsystem) → Connect To Server → (після On Connected) → Publish
Створювати клієнта чи зберігати його у змінній не треба — підсистема робить це за вас. Див. 2. Швидкий старт.
Чи потрібен C++?¶
Ні. Кожна операція — Core, JetStream, Key-Value, бінарні дані — доступна нодою. C++
потрібен лише для того, що структурно неможливо в Blueprint: наприклад, отримати повний
об'єкт відповіді запиту через RequestAsyncWithMessage (звичайний Request Async в BP
повертає лише текст відповіді). Див.
5. Основний обмін повідомленнями.
Чи потрібні сторонні бібліотеки або офіційний NATS SDK?¶
Ні. Плагін реалізує протокол NATS напряму поверх стандартних модулів Unreal (Sockets,
Networking) — нічого додатково встановлювати не треба.
Підсистема, компонент чи NATS Core Client — що обрати?¶
Підсистема — типовий вибір для більшості проєктів: один спільний потік повідомлень на всю гру, без ручного керування життєвим циклом. Компонент — коли з'єднання логічно належить конкретному актору. Голий клієнт — просунуті сценарії. Порівняльна таблиця — 5. Основний обмін повідомленнями.
Чи можна користуватися плагіном без JetStream?¶
Так, повністю. Publish/Subscribe/Request-Reply (режим Core) працюють незалежно від того, чи увімкнено JetStream на сервері. JetStream — окремий, додатковий шар для збереження повідомлень; докладно — 1. Вступ до NATS.
Налаштування й облікові дані¶
Чи потрапляють облікові дані, вписані в Project Settings, у зібрану гру?¶
Так, у відкритому вигляді — вони йдуть у DefaultGame.ini разом зі збіркою. Для тестування
в редакторі є окремий, безпечний оверрайд; для продакшн-гри чи виділеного сервера —
отримання даних під час виконання. Обидва варіанти — з прикладами —
4. Облікові дані: як не зберігати секрети в клієнті.
Як тестувати в редакторі з реальними обліковими даними, не вписуючи їх у Project Settings?¶
Editor Preferences → Plugins → NATS Messaging Client (Editor Only) — окрема сторінка,
значення якої лежать лише на вашій машині (Saved/Config/) і не входять у білд. Див.
4. Облікові дані → Editor Only credentials.
Що вписати в Auth Type, якщо сервер узагалі без авторизації?¶
None — значення за замовчуванням. Інші поля структури Credentials при цьому ігноруються.
Чи підтримується TLS (tls://)?¶
Ні, у поточній версії з'єднання лише незашифроване. Якщо потрібне шифрування каналу — використовуйте VPN, SSH-тунель чи TLS-термінацію на рівні мережевої інфраструктури перед NATS-сервером.
Чи підтримується повна децентралізована автентифікація NATS (JWT + NKey)?¶
Не повністю. Плагін передає ваш JWT-токен полем jwt команди CONNECT, але не виконує
підписування виклику сервера (nonce) через NKey — тобто не реалізує повний протокол
децентралізованої автентифікації NATS. Підходить для серверів, що приймають JWT напряму
(наприклад, через
auth callout).
Детальніше — 3. Налаштування.
Повідомлення й subject¶
У чому різниця між * і >?¶
* — рівно один токен subject'а. > — один або більше токенів, і лише в кінці шаблону.
Приклади й таблиця — 1. Вступ до NATS.
Чи можна підписатися на кілька subject'ів одним викликом?¶
Ні — кожен Subscribe приймає один рядок (можливо, із шаблоном). Кілька непов'язаних
subject'ів — це кілька окремих викликів Subscribe.
Чи підтримуються групи черг (queue groups) для балансування навантаження?¶
Ні, у поточній версії Subscribe не приймає ім'я групи — кожна підписка незалежна й
отримує кожне повідомлення. Якщо потрібно розподілити обробку між кількома воркерами так,
щоб кожне повідомлення дісталося лише одному з них, — використовуйте JetStream pull-
споживача: сервер сам гарантує, що те саме повідомлення не буде видано двом одночасним
запитам Pull Messages. Приклад — 9. JetStream: споживачі → Черга завдань.
Який максимальний розмір повідомлення?¶
Обмежує сервер, полем max_payload у своїй конфігурації (у локальному сервері, що йде з
плагіном, — 1 МБ). Клієнт із версії 2.1 сам піднімає ліміт прийому, якщо сервер
заявляє більший max_payload; на відправку клієнт власного обмеження не накладає —
завелике повідомлення сервер відхилить помилкою протоколу, яку буде видно в On Error.
JetStream¶
Чим стрім відрізняється від звичайної підписки?¶
Звичайна підписка (Core) отримує лише те, що опубліковано, поки вона активна — нічого не зберігається. Стрім зберігає повідомлення на сервері; прочитати їх можна навіть через годину, створивши споживача. Детально — 1. Вступ до NATS.
Push- чи pull-споживач обрати?¶
Push — коли потрібна миттєва реакція в реальному часі. Pull — коли темп обробки повинен контролювати сам споживач (пакетна обробка, черги завдань). Порівняльна таблиця — 9. JetStream: споживачі.
Чи обов'язково створювати стріми й бакети через Project Settings?¶
Ні, це лише зручність. Створювати можна й прямим викликом Create Stream/Create KV
Bucket у коді чи графі, коли завгодно після того, як JetStream став доступний. Project
Settings — декларативний спосіб для тих, кому зручно все в одному місці. Див.
3. Налаштування.
Що станеться, якщо не встигнути підтвердити повідомлення за AckWait?¶
Сервер вважає, що повідомлення не оброблено, і доставляє його знову — NumDelivered
зростає. Якщо обробка систематично довша за поточний AckWait — збільшуйте це значення в
конфігурації споживача, а не підтверджуйте передчасно. Детально —
9. JetStream: споживачі.
Помилки й мережа¶
On Connected ніколи не спрацьовує¶
Сервер недоступний за вказаною адресою чи портом. Перевірте кнопкою Test Connection
у Project Settings і подивіться подію On Error — вона містить причину. Див.
11. Помилки та діагностика.
Request Async завжди повертає тайм-аут¶
Найчастіша причина — відповідач не публікує назад у Message.ReplyTo, або підписаний не
на той самий subject, куди надсилається запит. Див.
5. Основний обмін повідомленнями → Request/Reply.
Чи перепідключається плагін сам після розриву зв'язку?¶
Так, якщо увімкнено b Auto Reconnect (типово так) — підсистема й компонент самі
повторюють спроби підключення до того самого сервера, до якого підключалися востаннє.
Голий NATS Core Client сам не перепідключається — див. примітку в
5. Основний обмін повідомленнями.
Мультиплеєр і сервер¶
Чи плагін реплікує щось мережею Unreal?¶
Ні. Він відкриває окреме TCP-з'єднання до NATS-сервера з того процесу, де його викликали —
це повністю відокремлено від реплікації акторів Unreal. Питання «як це працює в
мультиплеєрі» зводиться до питання «у якому саме процесі (клієнт, сервер, обидва) я
викликаю ноди плагіна» — вирішуєте це ви самі, як і будь-яку іншу гілку логіки за
Has Authority/Switch Has Authority.
У сесії на восьми клієнтах повідомлення публікується вісім разів¶
Ймовірно, виклик Publish стоїть у коді, що виконується на кожному клієнті локально
(наприклад, у Tick актора без перевірки авторитету). Захистіть виклик перевіркою
Switch Has Authority, якщо публікувати повинен лише сервер.
Чи працює плагін на виділеному сервері без відображення (headless, -nullrhi)?¶
Так — плагін працює на рівні сокетів і не залежить від рендера. Підходить і для
-server-збірок, і для запуску в контейнері без GPU.
Різне¶
Чи можна мати кілька незалежних з'єднань одночасно?¶
Так — кожен NATS Client Component (на різних акторах) чи власний екземпляр NATS Core
Client тримає власне, повністю незалежне з'єднання: свою адресу, облікові дані,
підписки.
Чи є ліміт на кількість одночасних підписок?¶
Плагін власного ліміту не накладає — обмежує лише сервер (типово досить високий, тисячі підписок на з'єднання). На практиці ви обмежені радше кількістю осмислених subject'ів у вашій грі, ніж технічною стелею.
Чи можна опублікувати повідомлення, поки клієнт ще не підключений (наприклад, у чергу)?¶
Ні — Publish/Publish Bytes одразу повертають false, якщо Is Connected дає false
у момент виклику; плагін не буферизує повідомлення для відкладеної відправки. Якщо потрібна
саме така поведінка — реалізуйте власну чергу «на боці гри» і спорожняйте її в обробнику
On Connected.
Тестовий модуль плагіна (NatsClientTests) потрапляє у зібрану гру?¶
Ні. Він має тип Editor — збирається лише для редактора та ніколи не потрапляє в
Development- чи Shipping-збірку гри.
Далі: Примітки до випуску