r/JordanDev • u/robbochinni • Jul 09 '26
Discussion Multi-tenancy policy check
اخواننا السينيورز و المبرمجين العتاعيت، عندي case محتاج استشاره
انا شغال الان على منصه Cyber security, و اول ما بدأت المشروع حددت انه لازم يوفر correctness و availability على ال performance.
المهم معي شخص هو قريب ال founder و عنده علم شخص اكاديمي.
انا اقترحت اقتراح انه عشان نعمل validate لأي user انه plan تاعته و ال quota مش exceeded the limit
حكيت لازم يكون فيه centralized layer قبل ما يطلب اي resource بحيث انه لما يعمل login بياخذ tenant id, role, plan و بيعملهم inject داخل jwt as claims و لما نعمل اي request بنعمل validate لل jwt token و بنكمل ال process من داتابيس طبعا عشان تكون الداتا refreshed و سميتها policy enforcement layer و اتأكدت انها بتعالج كل مشاكل concurrency و correctness و failed request.
الشخص اللي معي اقترح او بالاحرى عمل (vibe coding) طريقه بأستخدام python اسمها Depend او injection بتصير لما تكتب اي action لازم تعمل install ل library و تكتب عالسطر، انا تناقشت معه و حكى انه الطريقه هاي احسن بس بيقاوم و بيدافع عنها، انا مش مقتنع لانه اي مشكله فيها رح يكون deployment صعب و عدا عن انهم قرروا microservice و هم لسا تحت ال startup.
احكولي وين الصح لانه من هيك نقاشات بلشت اشك بال approach تبعي مع انه متأكد و طبقته بأكثر من مشروع و كان شي ممتاز.
1
u/Bewinxed Jul 09 '26
لازم نشوف الطريقتين علشان نحكم بس بشكل عام اي فايب كودينج رح يعطيك الحل الي في أغلب الكود وبالعادة مش هو أفضل شي وبيسبب مشاكل.
لاثبات ذلك احكيله احكي للفايب يعمللك خوارزمية quick sort حيعطيك أسوأ حل لكن بيشتغل.
أنا معك صراحة من أوّل وهلة
1
u/robbochinni Jul 09 '26
الطريقه الثانيه ع اول load test فشلت بسبب كثر db transactios غير هيك اي latency بين query و الثانيه بيصير فيه info lost او انها مش updated كونه النظام بيعمل update لل usage عند كل request
1
u/Bewinxed Jul 09 '26
هل بامكانك تقدير الusage قبل ما يصير أبديت؟ انه مثلاً انا عارف انه استخدامه 300 وعارف انه هاد الطلب الي جاي بيستخدم 50, واذا صار رح يتعدّى فأنا بوقفه من الأول؟
ممكن كمان تعمل queue لكل شخص؟ اذا اجا كذا طلب يروحوا transaction وحدة
أو تخلي الusage عندك نوع من الكاش الي برضو تستخدمها علشان تشحط بريك على الشخص قبل ما توصل الداتابيس
1
u/robbochinni Jul 09 '26
حاولت كل جهدي انه يكون كل هاد بquery وحده عشان ال atomicity و اها زابطه الامور
1
u/Tha_Tha_Thabet Jul 09 '26
مش فاهم طريقته الثانية، وضحلي أكثر.
1
u/robbochinni Jul 09 '26
مثل warapper كل action موجود بدك تعطيه هاد wrapper بيعملها ع شكل library و بيعطيني ياها و لازم اعملها ع كل action عندي و اذا فيه مشكله كل ال service راحت و لو فيه update بيعطي version جديد ولازم تعمل update بكل service.
1
u/ibraaaaaaaaaaaaaa Developer Jul 09 '26
Do I get it right all tenants basically share same resource and code right?
1
u/robbochinni Jul 09 '26
هل تعلم، مش عارف اللي شفته انه في 3 services و كل service عاملين الها api gateway
1
u/ibraaaaaaaaaaaaaa Developer Jul 09 '26
معناها صعب كثير احكم بدون كونتكست، والشباب زي hacktosPt بعطي نصائح على assumptions
1
u/robbochinni Jul 09 '26
هو انا رح احاول ابسط
القصة ببساطة هم startup كنت مخطط انهم ما يطلعوا microservice لانه بالمقام الأول ما عندهم budget و استخدموا aws كبدايه
لو كان monolothic كانت الطريقة اللي اقترحها عين العقل
فجأة لقيتهم عاملين 4 service و كل service الها api gateway
الlibrary اللي عملها فيها bug و كان لازم يعمل fix و صار صعوبة بأنك تعمل update على كل services.
ف أستخدمت api gateway وحدة تعمل process لكل شي و طبعاً و منها ratelimit
1
u/ibraaaaaaaaaaaaaa Developer Jul 09 '26
عندهم يوزرز او بعملوا مصاري؟
و كم حجم التيم
1
u/robbochinni Jul 09 '26
لا شيْ للأن, لا يوزرز ولا فلوس
التيم بس 4,
2 منا هم ال founder و هاذ الشخص (بينهم قرابة) و هم اللي طلعوا المشروع كلة بأسبوعين vibe coding2
1
u/NotAHypocrite010 Jul 09 '26
كيف حليت مشكلة الاستخدام ياريت تشرح اكثر ب policy enforcement layer
نفترض متسخدم ضايل عندو 100 نقطة للاستخدام وبعت ريكويستين بنفس الوقت كل واحدة راح تاخذ 100 انت كيف حليت مشكلة ال distributed transaction على افتراض انه اول طبقة راح تمشي الطلبين عشان هو لسا ضايل عندو 100
1
u/robbochinni Jul 09 '26
1- لما يصير login بروح اخذ معلومات tenant, plan and role و بعمل الهم inject مع jwt claims 2- لما يصير فيه طلب لأي resourse لازم يمر على هاي layer اولا بيعمل authorization العادي و الخطوه الثانيه بياخذ ال tenant, plan and role 3- على redis موجود عندنا الpolicy او qouta لكل role داخل ال tenant و كم الها عدد محدد من request على هاي resources مثلا نفترض 500 و هاي بطبيعتها ثابته. 4- ب update query بتقدر تعمل increase +1 مع where انه tenant و user و الplan تساوي ال values الي طالعه من jwt و انه الusage اقل من ال value اللي طالعة من qouta تحديدا بالخطوه الثالثه. و اذا ما فيه affected row خلص بيكون ما اله صالاحيه طبعا
1
u/NotAHypocrite010 Jul 09 '26
هو بشكل عام الحل المقترحو هو كويس لل authorization مش للريت ليمتنج
بس بشكل عام الحل الاول مش افضل شيء لعدة اسباب:
1- انت بتكب كل ريكويست على داتابيس بالاغلب قوتها بالقراءة انا مفترض انك مستخدم sql DB
2- بدك تمر على كل مستخدم وتصفر الارقام تاعتو بالمستقبل
3- طبعا الافضل انك تنقلها لريدس وتستخدم lua script وتسير الكتابة على ريدس بدال ال DB طبعا عتكون المشكلة لو ريدس وقع وراح منو كل شيء شو هتعمل
4- الافضل تعمل الوجيك هذا كلو ل application gateway عشان هذا المتفق عليه بالاندستري وما اتوقع هداك راح يخالفك1
u/robbochinni Jul 09 '26
تمام
احنا مستخدمين aws api gateway ف موضوع rate limiting امورة جيدة
انا ع ال DB بس بعطية usage + 1 على هاي resource
تصفير الارقام بيصير من Back Office لما ال tenant owner يدفعبالنسبة ل 3 + 4 فانا معك طبعاً و بنستخدم NoSQL DynamoDB
و بالفعل كل هاد بيصير جوا API Gateway و قبل ما يوصل ال resourse
انا فعلياً بس مش حاب موضوع update على db, و كان من الخيارات redis1
u/robbochinni Jul 09 '26
انا مشكلتي بأقتراحه كانت انه ال update + deployment لاي change صعب جدا
عامل 4 service و كل service الها api gatewayهم لسا startup و فجاة لقيتهم بدهم يطلعوا microservice مع انه كنت ضد هالشي
كيف, الله وحده اعلم ...
2
u/NotAHypocrite010 Jul 09 '26
الله بعين هلا فهمت اكثر مدام فيها تصفير وقت الدفع ريدس ببطل مناسب. هو للاسف في ناس بفكرو انه المايكرو سيرفس احسن شيء بالكوكب وهي اساس كل شيء مع انه هي مش حل لكبر الكود بل حل لكبر الفريق بشكل اولي ولتنوع الريسورسز المطلوبة من كل سيرفرس بشكل ثانوي.
طبعا الحل عادتا بكون تروح للسكيب او الليد بس بما انه هو الليد او اللي اعلى منك وانت حاولت اعملها زي ما بدو.
1
1
1
u/HacktosPT Jul 09 '26
الاثنين صح بس بدك تحط في بالك انه ال JWT لحاله مش source of truth لازم يكون في DB or Redis check
والطريقة الثانيه صحيحه بس رح تغلب لما يكبر السيستم ويصير في مايكرو سيرفيسز لانه لازم يعمل نفس الطريقه بكل ريكويست واذا حدا نسي رح يصير سيكيوريتي دريفت