Навбати паём: RabbitMQ, Кафка
Навбати паём: RabbitMQ, Кафка
1) Кай интихоб кардан лозим аст
Харгӯш (AMQP 0-9-1/1). 0, навбатҳои классикӣ, навбатҳои кворум, ҷараёнҳо)
Мувофиқ аст: RPC/фармонҳо, ҷараёни кор, вазифаҳои кӯтоҳ, масири фанат/мавзӯъ, тасдиқи тағйирпазир, назорати афзалият.
Тарафдор: семантикаи масири бой (мубодила), 'асосӣ. qos '(prefetch), ҳар як паём TTL/таъхир, намунаҳои қулайи RPC (посух ба), оғози осон.
Омӯз: Таърих дар навбат нигоҳ дошта мешавад, ба таври уфуқӣ дар навбат/шардҳо васеъ карда мешавад; Арзиши баланди интиқол бо ҷараёнҳои хеле калон.
Apache Kafka (сабти рӯйдодҳо, ҳизбҳо, гурӯҳҳои истеъмолкунандагон)
Мувофиқ аст: ҷараёнҳои ҳодиса, аудит, сарчашмаи рӯйдодҳо, ETL/интегратсия (Connect), RPS/MB-ҳои баланд, такрорӣ/коркарди дубора, коркарди ҷараён (ҷараёнҳо/ksqlDB).
Тарафдор: маҷаллаи дарозмуддат, миқёси тарафҳо, такрори устувор, фишурдани калидҳо.
Омӯз: модели pull + тарафҳо - на барои RPC хурд; фармоиш танҳо дар дохили ҳизб; идоракунии схема/ҳамоҳангсозӣ масъулияти даста аст.
2) Семантика ва инвариантҳои таҳвил
Аксар вақт: ҳеҷ гуна бознигарӣ нест; зуд, хатари талафот.
Ҳадди аққал як бор: бо ақибнишинӣ; idempotency истеъмолкунандаро талаб мекунад.
Маҳз як маротиба: дар шароити маҳдуд имконпазир аст (Kafka TX + истеҳсолкунандаи idempotent + танӯраи пайваста; Харгӯш MQ - тавассути ҷадвали тақсимкунӣ/калидҳои idempotent).
Фармоиш: RabbitMQ - тартиби навбат (метавонад бо ретрас/бисёр истеъмолкунандагон вайрон карда шавад); Кафка - фармоиш дар ҳизб, калид тақсимотро муқаррар мекунад.
Инвариантҳои домейн: пул/тавозун - тавассути маҷаллаҳо/сагҳо ва дастаҳои idempotent; ба LWW такя накунед.
3) Намунаҳои ҳамгироӣ
Outbox/Inbox: сабти атомии ҳодиса дар пойгоҳи додаҳо → нашр ба навбат (outbox) ва истеъмоли номатлуб бо сабти коркард (паёмдони паёмдони).
DLQ (ҳарфҳои мурда): пас аз кӯшиши N/хатогиҳо - дар DLQ + ҳушдор.
Retry/Таъхир: RabbitMQ - TTL + мубодилаи мактубҳо; Кафка - мавзӯъҳоро бо ақибмонӣ такрор кунед.
Дархост/Ҷавоб: Харгӯш MQ - 'ҷавоб _ ба' + 'таносуби _ ид'; Кафка - кам, танҳо бо намунаҳои махсус.
Ҷубронпулӣ: sagas бар рӯйдодҳо; ҳар як амалиёт баръакс дорад.
4) Тарҳи калидӣ ва топология
Харгӯш MQ
Мубодила: 'мустақим', 'мавзӯъ', 'fanout', 'сарлавҳаҳо'.
Калиди масир: Хит (ҳо) -и навбатиро муайян мекунад. Барои афзалият - навбатҳои алоҳида.
QOS: 'prefetch' (масалан, 50-300) сатҳи тавозун/таъхир.
Quorum Queues: навбатҳои такрорӣ дар Рафт; иваз классикии оина.
Ҷараёнҳо: ҷараён бо ҷубронпулӣ (ба монанди Кафка) барои интиқоли баланд/такрорӣ.
Кафка
Мавзӯъ → қисмҳо: нақшаи '# қисмҳо' оид ба гузариши мақсаднок ва параллелизм (афзоиши мувофиқ ба қафо аз коҳиш осонтар аст).
Калид: ҳамаи сабтҳои як калид - дар як қисм (кафолати тартиб аз рӯи калид).
Омили такрорӣ: 3 барои мавзӯъҳои истеҳсолӣ, 'мин. insync. нусхаҳои = 2 '+' acks = ҳама 'барои эътимоднокӣ.
Нигоҳ доштан: аз рӯи вақт/андоза; фишурдасозӣ - арзишҳои охиринро бо калид + қабрҳо барои нест кардан нигоҳ медорад.
5) Retrai, DLQ, idempotency
Харгӯш MQ
Такрор мекунад: ҳар як паём TTL + DLX (мубодилаи мактубҳо) бо бозгашт (масалан, 1m → 5m → 15m).
Idempotence: 'correlation _ id '/' message-id' + ҷадвали паёмҳои коркардшуда (TTL) ё фармонҳои детерминистӣ.
Тасдиқҳо: дастӣ 'basic. ack 'пас аз муомилоти бомуваффақият;' асосӣ. nack (requeue = false) 'v DLQ.
Кафка
Такрори: мавзӯъҳои такрории инфиродӣ; истеъмолкунанда пас аз таъсири бомуваффақияти тарафҳо ҷуброн мекунад.
Коркарди маҳз як маротиба (EOS): Истеҳсолкунанда 'имкон медиҳад. idempotence = true ', истеҳсолкунандаи муомилот/истеъмолкунанда,' read _ condred 'ба истеъмолкунанда; танӯра (масалан, Кафка → Кафка ё Кафка → ДБ тавассути транзаксия) - ба таври дақиқ ҳамоҳанг карда мешавад.
Dedup: бо калиди калидӣ/idempotent дар тарафи асосӣ ё тавассути мавзӯи фишурда.
6) Иҷро ва андоза
Қонуни Литл: 'L = λ × W'
Барои vorker: такрори 'N саҳҳомӣ лозим аст (1. 2–1. 5)`.
Prefetch-и харгӯш: Бо 'prefetch = 100' оғоз кунед ва p99/вақти парвозро чен кунед.
Қисмҳои Кафка: ҳисоб аз параллелизми дилхоҳи истеъмолкунандагон ва ҳадафи интиқол (масалан, партияи 1 устувор аст 5-20 MB/s дар SSD/10 ГБ).
7) Мушоҳида ва огоҳиҳо
Умумӣ:- Lag/Backlog (паёмҳо/байтҳо), синну соли паёмҳо (p95/p99), суръати хатогии коркард, DLQ-сатҳи.
- Вақт "publikatsiya → obrabotka" (ба охир мерасад).
- Харитаи вобастагӣ: истеҳсолкунанда → брокер → истеъмолкунанда.
- Пайвастшавӣ, каналҳо, паёмҳои бидуни сабт, 'memory _ alarm', 'disk _ free _ limit', 'дарозии навбат' p95.
- Ҳисоботҳо дар бораи Кворум (роҳбар, дафтарчаи Рафт, 'кворум кофӣ нест').
- Қисмҳои такрорӣ, ISR кам/васеъ мекунанд, тағиротҳои назоратӣ.
- Хатогиҳои истеҳсолкунанда (танаффус, 'таъхири дархост'), ақибмонии истеъмолкунандагон дар гурӯҳ/қисм.
- Брокер I/O, хит кэш саҳифа, GC, Zoo
8) Бехатарӣ ва бисёрҳуҷрагӣ
Рамзгузории TLS дар транзити транзитӣ, аутентификатсия (SASL/PLAIN/SCRAM/OA buth, mTLS).
Авторизатсия: vhost/иҷозат (RabbitMQ), ACL ба мавзӯъҳо/гурӯҳҳо (Кафка).
Квотаҳо: барои пайвастшавӣ, каналҳо, андозаи навбат/мавзӯъ, суръати нашр/хониш.
Ҷудокунӣ аз рӯи муҳитҳо (dev/stage/prod) ва бо фазои ном/vhost.
9) Амалиёт ва танзими
Харгӯш MQ
Мубодилаи почта/навбатҳо ба гиреҳҳо (пойтахти CPU/IO).
Навбати танбалӣ (паёмҳо ба диск) барои буферҳои калон; аз навбати "гарм" худдорӣ кунед.
Навбатҳои кворум барои HA; Андозаи сабти Raft ва диск.
Сиёсати TTL/маҳдудияти дарозӣ, навбатҳои афзалиятнок танҳо барои эҳтиёҷоти воқеӣ (гарон).
bash rabbitmqctl set_policy DLX "^task\." \
'{"dead-letter-exchange":"dlx","message-ttl":60000,"max-length":100000}' --apply-to queues
Кафка
SSD/NVM je, шабакаҳои зуд; Танзими OS (swappiness паст, маҳдудиятҳои файл).
'acks = all', 'дароз. ms '(butching),' фишурдасозӣ. навъи = zstd '/lz4 барои фарохмаҷро.
Имконоти истеъмолкунандагон: 'макс. назарсанҷӣ. фосила. хонум ',' макс. назарсанҷӣ. сабтҳо ',' овардан. мин. байт '.
Нигоҳдорӣ ва фишурдасозӣ - тавозуни нигоҳдорӣ/такрорӣ.
java props. put("acks","all");
props. put("enable. idempotence", "true");
props. put("max. in. flight. requests. per. connection","1");
props. put("retries","10");
10) Интегратсия ва экосистема
Kafka Connect (Sinks/Манбаъҳо), Феҳристи схема (Avro/JSON/Protobuf) ва ҳамоҳангсозӣ ('BACKWARD/FORWARD/FULL').
Kafka Streams/ksqlDB: амалиёти давлатӣ, тирезаҳо, агрегатҳо.
Харгӯш/MQ Shovel/Федератсия: интиқол байни кластерҳо/марказҳо.
Операторони K8s: Стримзи (Кафка), Оператори кластерии RabbitMQ; Манифести Gitops.
11) Рӯйхати санҷиши татбиқ (0-45 рӯз)
0-10 рӯз
Ҳолатҳои истифодабариро муайян кунед: фармонҳо/вазифаҳо (RabbitMQ), рӯйдодҳо/аудитҳо (Кафка).
Калидҳоро интихоб кунед ('калиди масир '/' калиди қисмбандӣ'), SLO-ро "publikatsiya → obrabotka" таъин кунед.
Сиёсати асосии амният (TLS, ACL), квотаҳо, DLQ/TTL.
11-25 рӯз
Татбиқ кардани қуттиҳо/паёмдонҳо, аблаҳӣ ва deadup.
Бо ақибнишинӣ ақибнишинӣ кунед (Харгӯш: TTL + DLX; Кафка: мавзӯъҳои такрорӣ).
Панели панелҳо: ақибмонӣ, синну сол, меъёри DLQ, таъхири ниҳоӣ; ҳушдор медиҳад.
26-45 рӯз
Танзими фарохмаҷро: prefetch/acks (Харгӯш); қисмҳо/акс/партия (Кафка).
Тартиби DR (оина/нусхабардорӣ), санҷишҳои нокомии гиреҳ.
Шартномаҳои рӯйдодҳои ҳуҷҷатӣ (схемаҳо) ва сиёсати созгорпазирӣ.
12) Анти-намунаҳо
Як воситаи "универсалӣ" барои ҳама вазифаҳо.
Набудани DLQ/TTL: заҳрҳои абадӣ (паёмҳои заҳрнок).
'Prefetch' бемаҳдуд → гуруснагии истеъмолкунандагон, афзоиши p99.
Кафка бе калидҳо → аз даст додани фармоиш/ҳизбҳои гарм бо нобаёнӣ.
"Маҳз як маротиба", бидуни эҳтиёҷ/интизоми воқеӣ, ҳисси бардурӯғи амният аст.
Асрҳо/вурудҳо дар рамз, бе TLS/ACL.
Hardcode схемаҳо/версияҳои паёмҳо бидуни Феҳрист ва муҳоҷират.
13) Нишондиҳандаҳои камолот
Lag/синну соли SLO ≥ 99% вақт иҷро карда мешавад; Меъёри DLQ таҳти назорат аст.
Idempotency 100% роҳҳои муҳимро фаро мегирад; outbox/паёмдони татбиқшуда.
Нигоҳдорӣ/фишурдасозӣ ҳуҷҷатгузорӣ карда мешавад, такрорӣ истеъмолкунандагонро вайрон намекунад.
Огоҳиҳо дар бораи ISR/URP (Kafka) ва Raft/disk (Rabbit) муқаррар карда шудаанд.
Шартномаҳои рӯйдодҳо санҷида мешаванд (Феҳристи схема), мутобиқат дар CI санҷида мешавад.
Рӯзҳои муқаррарии бозӣ: гиреҳ/брокер/нокомии AZ, санҷиши барқароршавӣ.
14) Намунаҳои конфигуратсияҳо (хулоса)
Харгӯш MQ: префикс ва тасдиқҳо (псевдокод):python channel. basic_qos(prefetch_count=200)
for msg in consume("tasks"):
try:
handle(msg)
channel. basic_ack(msg. delivery_tag)
except Transient:
channel. basic_nack(msg. delivery_tag, request = False) # will go to DLQ
Истеъмолкунандаи Кафка (ғояҳо):
java props. put("enable. auto. commit","false");
props. put("isolation. level","read_committed"); // при EOS
//...
poll -> process(idempotent) -> commitSync()
15) Хулоса
Харгӯшҳо ва Кафка синфҳои гуногуни мушкилотро ҳал мекунанд: фармонҳо/вазифаҳо ва масири бой бар зидди сабти рӯйдодҳои дарозмуддат ва ҷараёни миқёспазир. Муваффақият - дар семантикаи дурусти таҳвил, интизоми аблаҳӣ, калидвожаи оқилона, бознигарӣ/DLQ, мушоҳида ва амнияти қатъӣ. Дар атрофи навбатҳо таҷрибаҳои муҳандисӣ созед - қуттиҳо/паёмдонҳо, схемаҳо ва сиёсатҳои GIT - ва ҳамгироии шумо пешгӯишаванда, миқёспазир ва устувор мегардад.