Я создал два очень простых веб-компонента. У обоих есть слушатель службы SSE, встроенной в ServerJ. Единственное отличие состоит в том, что одна конечная точка каждые 5 секунд отвечает на простые данные, а другая конечная точка использует тему Кафки и отвечает на простое сообщение каждый раз, когда в этой теме публикуется новое сообщение.
Когда я запускаю бэкэнд (т.е. обе конечные точки), обе веб-сети работают правильно. Спустя одну или две минуты вебкомпонент, который использует сообщение Kafka, выбрасывает конечную точку NodeJ, просто вылетает, ничего не стоящее сообщение. (Ну не стоит хотя бы для меня).
Проверяя сервис NodeJs, я вижу, что он работает правильно. Я имею в виду, что всякий раз, когда я публикую сообщение в теме (kafka-console -roduction.bat --broker-list localhost: 9092 --topic test 'data: testing'), я вижу NodeJs consumer.on ('message', функция (сообщение) {...) запускается немедленно.
Странно для меня то, что первые сообщения, которые получает веб-компонент, затем просто перестают получать без каких-либо исключений (ну, по крайней мере, я не нашел никаких исключений в Chrome Debug).
Весь код находится в github, и только npm instal & npm start для обоих серверных частей будут работать, если у вас есть сервер zookeeper + сервер kafka + тема с именем test, и вы отправляете любые сообщения типа «data: my test»:
Front End: https://github.com/jimisdrpc/simplest-webcomponet/blob/master/public/index.html
Back End: https://github.com/jimisdrpc/simplest-kafkaconsumer
Вот наиболее значимая часть:
Конечная точка отвечает на перехват сообщения из темы Кафки:
...
response.writeHead(200, {
Connection: "keep-alive",
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
'Access-Control-Allow-Origin': '*'
});
consumer.on('message', function (message) {
response.write("event: sendMsgFromKafka\n");
response.write('id: ' + i++ + '\n');
response.write('data: ' + message.value);
response.write("\n\n");
});
Интерфейс: весь веб-компонент успешно читает только первые события и вылетает после нескольких попыток:
const template = document.createElement('template');
template.innerHTML = `<input id="inputKafka"/> `;
class InputKafka extends HTMLElement {
constructor() {
super();
}
connectedCallback() {
this.attachShadow({mode: 'open'})
this.shadowRoot.appendChild(template.content.cloneNode(true))
const inputKafka = this.shadowRoot.getElementById('inputKafka');
var source = new EventSource('http://localhost:5000/kafka_sse');
source.addEventListener('sendMsgFromKafka', function(e) {
console.log('fromKafka');
inputKafka.value = e.data;
}, false);
}
attributeChangedCallback(name, oldVal, newVal) {
console.log('attributeChangedCallback');
}
disconnectedCallback() {
console.log('disconnectedCallback');
}
}
window.customElements.define("input-kafka", InputKafka);
Полагаю, это не имеет отношения к Кафке, так как я вижу, что NodeJ всегда успешно используют сообщение темы. Возможно, мне нужно настроить какой-то дополнительный параметр в заголовке ответа, чтобы он не остановился через некоторое время. Интересно то, что с другим веб-компонентом, который читает службу NodeJs с интервалом 5 секунд, автоматический ответ никогда не перестает работать (вы можете проверить весь код в github, если хотите, но он точно такой же, за исключением того факта, что вместо Использование темы Кафки имеет setInterval (() => {..., 5000}.
Иногда, когда он прекращает читать Сервис NodeJs Kafka, я получаю GET http://localhost:5000/kafka_sse net::ERR_EMPTY_RESPONSE
исключение, но не всегда.
Подводя итог: вы можете думать, что сообщение, потребляющее Webcomponet через архитектуру NodeJs, выглядит так:
Webcomponent Eventsource Listener added when loaded the page in Browser -> Alive connection Opened -> Kafka Topic Message produced -> NodeJs Kafka Consumer consume message -> HTTP Server responds to Webcomponent
А тот без кафки как:
Webcomponent Eventsource Listener added when loaded the page in Browser -> Alive connection Opened -> setInterval -> HTTP Server responds to Webcomponent according to the interval and never crashes
Мой главный вопрос: почему эта архитектура останавливается после нескольких попыток, а точно такая же архитектура, но с обычными событиями - нет? Некоторые идеи касаются возможных уловок, чтобы сохранить соединение, или некоторых дополнительных деталей, так как NodeJs является однопоточным, будет высоко ценится.