
نسخة مشتقة من تنفيذ مرجع بروتوكول AT مع AppView محسّن للأداء، ومفهرس خرطوم يعتمد على Rust، وتخزين مؤقت Redis، وميزات مجتمعية للتواصل الاجتماعي المستضاف ذاتياً على نطاق واسع.
هذا هو فرع بلاك سكاي من التطبيق المرجعي لبروتوكول AT من قبل Bluesky Social PBC. يعمل على تشغيل AppView على api.blacksky.community.
نحن ننشر هذا من أجل الشفافية ولتستفيد المجتمعات الأخرى من العمل. هذا المستودع لا يقبل المساهمات أو القضايا أو طلبات السحب. إذا كنت ترغب في التطبيق الأصلي لـ atproto، استخدم bluesky-social/atproto.
جميع التغييرات موجودة في packages/bsky (منطق AppView)، services/bsky (إعدادات التشغيل)، وهجرة مخصصة واحدة. كل شيء آخر هو من المنبع.
تتضمن طبقة البيانات من المنبع مستهلك خدمة بلغة TypeScript (subscription.ts) يقوم بفهرسة الأحداث مباشرة. استبدلناه بـ rsky-wintermute، وهو مفهرس بلغة Rust، لعدة أسباب:
لا تزال طبقة البيانات و AppView من هذا المستودع تعمل كما هي. تقرأ من قاعدة بيانات PostgreSQL التي يكتب إليها Wintermute. نحن فقط لا نبدأ تشغيل اشتراك الخدمة المدمج.
هذه مفيدة على نطاق واسع لأي شخص يستضيف AppView بنفسه على نطاق واسع.
تحسين استعلام LATERAL JOIN (packages/bsky/src/data-plane/server/routes/feeds.ts)
getTimeline و getListFeed باستخدام LATERAL JOINs في PostgreSQL لفرض استخدام الفهرس لكل مستخدم بدلاً من مسح الجدول بالكامل. تحسن كبير للمستخدمين الذين يتابعون آلاف الحسابات.طبقة تخزين مؤقت Redis (packages/bsky/src/data-plane/server/cache/)
Timestamp طريقة .toDate() بعد إعادة التوزيع عبر Redis، مما يسبب تعبئة غير كاملة للملف الشخصي عند الوصول إلى ذاكرة التخزين المؤقت. نعمل حاليًا مع تعطيل التخزين المؤقت لـ Redis. الإصلاح هو تحويل الطوابع الزمنية إلى سلاسل ISO عند الكتابة إلى ذاكرة التخزين المؤقت وإعادة بنائها عند القراءة.فرض تفضيلات الإشعارات من جانب الخادم (packages/bsky/src/api/app/bsky/notification/listNotifications.ts)
reasons، يطبق الخادم تفضيلات الإشعارات المحفوظة للمستخدم. بدون ذلك، يتم فرض التفضيلات فقط من جانب العميل وليس لها تأثير.إصلاح مفتاح التوقيع القديم في مدقق المصادقة (packages/bsky/src/auth-verifier.ts)
forceRefresh)، يتم تجاوز ذاكرة التخزين المؤقت للهوية في طبقة البيانات ويتم حل مستند DID مباشرة من دليل PLC. يصلح فشل المصادقة بعد ترحيل الحساب حيث يتم تدوير مفتاح التوقيع ولكن ذاكرة التخزين المؤقت تحتوي على المفتاح القديم.تنقية JSON (packages/bsky/src/data-plane/server/routes/records.ts)
\u0000) والأحرف التحكم من السجلات المخزنة قبل تحليل JSON. هذه صالحة وفقًا لـ RFC 8259 ولكن يتم رفضها بواسطة JSON.parse() في Node.js، مما يسبب فشل تحليل rowToRecord صامت في طبقة البيانات يظهر كمنشورات مفقودة.البنية التحتية للمنشورات المجتمعية الخاصة التي تعيش على AppView بدلاً من PDSes الفردية. خاصة بكيفية عمل بلاك سكاي، ولكن يمكن أن تكون مرجعًا للمجتمعات الأخرى.
community.blacksky.feed.* مع نقاط نهاية للإرسال، والحصول، والحذف، والجدول الزمني، وعرض الخيوطcommunity_post (الهجرة: 20260202T120000000Z-add-community-post.ts)getPostThreadV2 لمزيج من الخيوط القياسية والمجتمعيةBLACKSKY_MEMBERSHIP_DB_URL)Bluesky Relay (bsky.network)
|
v
rsky-wintermute -----> PostgreSQL 17 <----- Palomar
(مفهرس Rust) | (بحث Go)
- مستهلك الخدمة | |
- معيد التعبئة | v
- مفهرس الوسوم | OpenSearch
- مفهرس مباشر |
v
bsky-dataplane (gRPC :2585) <--- Redis (اختياري)
|
v
bsky-appview (HTTP :2584)
|
v
خادم وكيل عكسي (Caddy/nginx)
| المكون | المصدر | الغرض |
|---|---|---|
| rsky-wintermute | blacksky-algorithms/rsky | مفهرس خدمة بلغة Rust: يستهلك الأحداث، يعيد تعبئة المستودعات، يفهرس السجلات في PostgreSQL |
| rsky-relay | blacksky-algorithms/rsky | مكرر بروتوكول AT لتلقي وسوم التعديل من خدمات الوسم |
| rsky-video | blacksky-algorithms/rsky | خدمة رفع الفيديو: تحويل عبر CDN Bunny Stream، رفع مراجع البلوب إلى PDSes الخاص بالمستخدم |
| bsky-dataplane | هذا المستودع (services/bsky) | طبقة بيانات gRPC فوق PostgreSQL |
| bsky-appview | هذا المستودع (services/bsky) | خادم API HTTP لنقاط نهاية XRPC لـ app.bsky.* |
| Palomar | blacksky-algorithms/indigo | بحث كامل النص: يفهرس الملفات الشخصية والمنشورات في OpenSearch مع تعزيز عدد المتابعين |
| palomar-sync | blacksky-algorithms/rsky | يزامن أعداد المتابعين ونتائج PageRank من PostgreSQL إلى OpenSearch |
Wintermute هي خدمة Rust متجانسة مع أربعة مسارات معالجة متوازية:
bsky.network عبر WebSocket، يكتب الأحداث إلى طوابير Fjall (مخزن قيم-مفاتيح مضمن)ON CONFLICT لضمان عدم التكرارأدوات CLI إضافية مضمنة في مستودع rsky:
queue_backfill — إدراج DIDs في قائمة انتظار إعادة التعبئة من CSV، أو اكتشاف PDS، أو قوائم DID مباشرةdirect_index — جلب وفهرسة مستودعات محددة متجاوزًا الطوابير (مفيد لإصلاح حسابات فردية)label_sync — إعادة تشغيل تدفق الوسوم من المؤشر 0 للحاق بالنفي المفقودplc_import — استيراد تعيينات handle/DID بكميات كبيرة من دليل PLCpalomar-sync — مزامنة أعداد المتابعين وPageRank إلى OpenSearchخدمة رفع الفيديو للمستخدمين الذين لا يدعم PDS الخاص بهم تطبيق Bluesky video.bsky.app. تستخدم DID الخاصة بها (did:web:video.blacksky.community) للمصادقة على PDSes الخاص بالمستخدم عبر JWTs مصادقة الخدمة. التدفق:
تأتي وسوم التعديل من خدمات الوسم (مثل Ozone من Bluesky) عبر اشتراك WebSocket. يقوم مبتلع Wintermute بمعالجة الوسوم في طابور مخصص label_live (حجم منخفض، منفصل عن الخدمة الرئيسية). يمكن لأداة label_sync إعادة تشغيل التدفق الكامل للوسوم للحاق بالنفي المفقود (إزالة الوسوم) دون إعادة إدراج الوسوم.