CH. Сообщения большого размера блокируют отправку
Возникла ситуация - перестали отправляться метрики из процессов Дискавери, при этом размер самих процессов начала расти. При разбирательстве обнаружилось, что сообщения копятся внутри процессов но не отправляются:
import objgraph
ds = objgraph.by_type('DiscoveryService')[0]
q2 = ds.topic_queues['chwriter-1-2']
messages = list(q2.iter_get(n=10, size=20000000,total_overhead=4,message_overhead=4))
len(messages[0])
5244211
>>> messages[0][0:300]
'raw_mac\n{"interface":"ge-0\\/0\\/35","mac":16000216,"is_uni":0,"date":"2019-10-07","interface_profile":5602446783968 424114,"vlan":31,"segment":7814856781138097774,"ts":"2019-10-07 00:56:15","managed_object":5719333064771045441}\n
Видно, что сообщение с MAC адресами блокирует отправку. В логах дискавери по проблемны объекта:
685434336346265842 - 6274 MAC addresses are collected. Sending
1939013308481535212 - 11104 MAC addresses are collected. Sending
4604589900537529570 - 36064 MAC addresses are collected. Sending
Судя по всему, проблема в этом месте: core.nsq.topic.Topic.iter_get
:
for _i in range(n):
try:
msg = self.queue.popleft()
m_size = len(msg)
total += m_size
if size and message_overhead:
total += message_overhead
if size and total > size:
# Size limit exceeded. Return message to queue
self.queue.appendleft(msg) <<<<< сообщение возвращается в очередь и там остаётся. В следующий раз это повторяется.
break
Необходим механизм работы с такими сообщениями. Просто дропать их нельзя, т.к. будут сложности с поиском причины проблемы с отправкой. Временное решение выглядит как распиливание сообщений при MAC дискавери перед отправкой.
Отслеживать наступление проблемы можно по метрике nsq_mpub
- число отправленных сообщений. В норме она должна монотонно возрастать, при проблеме не увеличивается: