Skip to content

🇬🇧 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-збірку гри.


Далі: Примітки до випуску