𝗦𝗶𝗺𝗽𝗹𝗲 𝗟𝗶𝘃𝗲 𝗖𝗵𝗮𝘁 𝗞𝗮𝗿𝗶𝗯𝘂 𝗜𝗮𝗻𝗴𝗮𝗺𝗶𝘇𝗮 𝗧𝗼𝗹𝗲𝗼 𝗛𝗶𝗹𝗶
Mfumo wa msingi wa chat ya moja kwa moja karibu uliharibu toleo langu la hivi karibuni.
Inaonekana rahisi. Unaonyesha watumiaji walio karibu na kuwaruhusu wazungumze. Lakini ukweli wa kiufundi ni mgumu zaidi. Ilibidi niunganishe chat ya moja kwa moja na geolocation pamoja na mfumo wa makadirio (rating system). Hii ilisababisha utata mkubwa wa kiufundi.
Muundo (The Architecture):
• Frontend: React na TypeScript. • Backend: Node.js kwa kutumia Express na WebSockets. • Database: PostgreSQL kwa ajili ya watumiaji na makadirio. • Cache: Redis kwa ajili ya vikao hai (active sessions) na uwepo (presence).
Tatizo la Geolocation
Kuoanisha watumiaji kwa kutumia eneo si rahisi. Ilibidi nishughulikie mazingira mengi magumu (edge cases):
- Kuhifadhi latitude na longitude.
- Kutumia viambata (extensions) vya Postgres kuulizia umbali.
- Kushughulikia watumiaji wanaokataa ruhusa ya eneo.
- Kusimamia data iliyopitwa na wakati (stale data) wakati mtumiaji anapohama bila kufungua programu.
Nikifanya hivi tena, ningetenganisha ukusanyaji wa eneo na uoanishaji (matching) katika huduma tofauti.
Ukweli wa Chat ya Moja kwa Moja
WebSockets huleta vipengele vya wakati halisi (real-time), lakini pia huleta vurugu. Nilitumia Redis pub/sub kutuma ujumbe kwenye seva tofauti.
Sehemu ngumu zaidi zilikuwa:
- Kusafisha miunganisho wakati watumiaji wanatoka bila kutarajia.
- Kuzuia ujumbe usitumwe kwenye vyumba ambavyo mtumiaji ameacha.
- Kushughulikia kuunganishwa upya bila kuunda vikao vya "ghost sessions".
Nilijifunza kuwa mashine rasmi ya hali (formal state machine) ni bora kuliko kutumia alama (flags) rahisi.
Mfumo wa Makadirio
Makadirio yanaonekana kuwa rahisi hadi unapoanza kuyajenga. Ilibidi nihakikishe:
- Watumiaji hawawezi kukadiria kikao kilekile mara mbili.
- Makadirio yaunganishwa haraka kwa ajili ya mitazamo ya wasifu (profile views).
- Data inabaki kuwa thabiti katika programu nzima.
Nilitumia vikwazo vya kipekee (unique constraints) kwenye session IDs kuzuia marudio na nikahifadhi wastani (cached averages) ili kuokoa utendaji (performance).
Mafunzo Niliyopata
Nikijenga upya hili leo, nitabadilisha mambo matatu:
- Kutenganisha uoanishaji (matching) na chat katika moduli tofauti.
- Kutumia uundaji wa wazi (explicit modeling) kwa hali za muunganisho wa WebSocket.
- Kuongeza kumbukumbu (logs) na vipimo (metrics) bora zaidi kwa ajili ya chat na uoanishaji tangu siku ya kwanza.
Kujenga programu ni mfululizo wa maamuzi madogo. Maamuzi haya huamua ikiwa mfumo wako ni safi au dhaifu.
Je, umewahi kujenga chat ya moja kwa moja au mfumo wa uoanishaji? Ungefanya nini tofauti?
Chanzo: https://dev.to/jaeger974/simple-live-chat-almost-sank-this-release-2pn7