NATS не вызывает исключение при отключении
Я использую почти стандартный пример использования NATS на Python Asyncio. Я хочу получить сообщение, обработать его и отправить результат обратно в очередь, но когда NATS отключен (например, перезагрузка комаров), исключение не возникает. Я даже ждал asyncio.sleep (1, loop = loop)
для изменения контекста и было выдано исключение отсоединить -> восстановить соединение, но этого не происходит. Что я делаю неправильно? Может быть, это ошибка?
import asyncio
from nats.aio.client import Client as NATS
import time
async def run(loop):
nc = NATS()
await nc.connect(io_loop=loop)
async def message_handler(msg):
subject = msg.subject
reply = msg.reply
data = msg.data.decode()
print("Received a message on '{subject} {reply}': {data}".format(
subject=subject, reply=reply, data=data))
# Working
time.sleep(10)
# If nats disconnects at this point, the exception will not be caused
# and will be made attempt to send a message by nc.publish
await asyncio.sleep(2, loop=loop)
print("UNSLEEP")
await nc.publish("test", "test payload".encode())
print("PUBLISHED")
# Simple publisher and async subscriber via coroutine.
await nc.subscribe("foo", cb=message_handler)
while True:
await asyncio.sleep(1, loop=loop)
await nc.close()
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(run(loop))
loop.close()
1 ответ
NAT построен поверх TCP.
TCP не имеет надежного сигнала отключения по определению. Чтобы решить эту проблему, любая система обмена сообщениями должна использовать пинг- сообщения и сбрасывать соединение, если происходит тайм-аут.
Строго говоря, иногда вы будете получать событие отключения, но это может занять до 2 часов (зависит от настроек вашей ОС).