Amr Elmohamady
Amr Elmohamady

@Amr__Elmohamady

12 تغريدة 6 قراءة Mar 11, 2023
في اول شغل ليا في شركة كنت بعمل realtime voice rooms app وكنت انا مسئول عن الrealtime وكنت شغال بnodejs والprimary database كانت MySQL بس الproject manager كان عايز احسن performance فقال نستخدم redis كdatabase للroom details حاجات زي مين في الroom ومين ماسك mics وحاجات كدة 🧵 /1
بس انا استغربت ساعتها لان redis عبارة عن memory store فالتكلفة هتبقي عالية لان الRAM غالية فقولت الكلام ده رد برد غير متوقع "عادي نشتري RAM". انا دايما اعرف ان الRAM غالية بس لما يكون عندنا عميل خليجي مفيش حاجة غالية :) /2
اكتشفت بعدين ان في ناس بتستخدم redis كdatastore كتير عادي مش بس للcaching ده غير ان الdata اللي محتاج اخزنها كانت قليلة: دي شوية room details ونقدر نعمل persistence بالappend-only file والsnapshots بسهولة /3
في المشروع ده انا اصلا كنت بستخدم redis pub/sub عشان الrealtime servers يتواصلوا فلو مثلا في مستخدمين في روم معينة في سرفر معين وفي مستخدمين في نفس الروم بس فى سيرفر تاني فلو حد بعت رسالة لاول سيرفر فاول سيرفر هيبعت للمستخدمين بتوعه وهيبعت لبقيت السيرفرات عن طريق redis ويقولهم /4
هيقولهم ان المستخدم ده بعت الرسالة دي عشان هم كمان يبعتوها للمستخدمين اللي عندهم والكلام ده عشان نحقق الhorizontal scaling وكدة كدة كنت بستخدم SocketIO ودي بتعمل كل التفاصيل لوحدها /5
في مشاريع تانية استخدمت redis لحاجات تانية:
- Session store
وده للauth بتاع الusers فكنت بخزن الsessions في redis عشان اقدر اخلي الserver يكون stateless واقدر اعمل horizontal scaling.
كان ممكن استخدم DB عادية بس هنا كل request هحتاج اجيب الsession فبقلل الlatency علي الاخر /6
تاني حاجة
- Rate limiter tokens store
وهنا كنت بستخدم الtoken-bucket algorithm ودي من خواروميات الrate limiting واللي هو بيمنع الDOS Attacks وده نوع من الهجوم بيبعت requests كتير عشان يزود الload علي الservers ويوقعهم او يخليني ادفع فلوس كتير تكاليف الbandwidth والسيرفرات /7
بس دلوقتي اقدر امنع الموضوع ده باني اخلي كل IP او مستخدم ميقدرش يبعت اكتر من 30 requests/min او طبعا علي حسب انت عايز ايه. طب ليه redis نفس الكلام اللي فوق عشان دي query في كل request فبقلل الlatency واستهلاك الresources وبعمل key lookups مش محتاج اي queries معقدة /8
تالت حاجة
- Primary database for news feed microservice
عشان الdata اللي هخزنها قليلة (posts Ids) واسرع الfeed ومش محتاج اكتر من key-value store وهعمل disk persistence و TTL (time-to-live) تمسح الfeed اللي متفتحش خلال سبع ايام مثلا عشان الmemory متتمليش بسبب الناس اللي مبتفتحش /9
برضه ناوي استخدم redis في نفس الmicroservice دي عشان اخزن فيها idempotent keys عشان اعمل idempotent consumers لqueue بتاخد من producer بيعمل transactional outbox عشان الfeed service تpopulate الfeeds للusers فقولي رأيك هل يستحق عشان مخليش user يشوف نفس البوست اكتر من مرة /10
طب ايه تاني ممكن تعمله بredis؟
بتقدملك modules وstack تقدر تستخدمها في حاجات كتير:
- RediSearch for full-text search
- RedisJSON for JSON fields
- RedisGraph as a graph database
- RedisTmeSeries
- Geo-distributed search
- Redis streams as an in-memory Kafka with less features
/11
وحاجات تانية فهسيب لينكبن حلويين فيهم redis usecases والmodules.
بس اوعي تستخدم redis وانت مش قدها في التكاليف او مش محتاجها فعلا.
Redis usecases:
redis.io
Redis modules:
redis.io
/12

جاري تحميل الاقتراحات...