مجموعة من المرافق للوحدات الأخرى. يتضمن LambdaReflection
الذي يسمح بتعيين قيم الحقول الخاصة بالمثيل والحصول عليها أو الوصول إلى المنشئ عبر الواجهات الوظيفية التي أنشأتها LambdaMetafactory
.
مكتبة تسلسلية مجردة تدعم أي تطبيق للمخزن المؤقت. يقوم تلقائيًا (إلغاء) تسلسل الفئات المميزة بـ @AutoSerializable
التي تتكون من حقول من الأنواع الافتراضية أو تطبيقات Proto4jSerializable
أو أعضاء @AutoSerializable
الآخرين.
يدعم أيضًا الوراثة: يمكن للفئة القابلة للتسلسل أن توسع @AutoSerializable
الأخرى وفي هذه الحالة ستصبح جميع الحقول الأصلية أيضًا متسلسلة بشكل عابر.
يجب إضافة تعليقات توضيحية إلى الحقول التي يجب تجاهلها أثناء التسلسل باستخدام @Transient
.
مكتبة شبكات مع تطبيق مخصص يستند إلى UDP مع موثوقية قابلة للتكوين.
يسمح لك Proto4jServer
و Proto4jClient
بنقل البيانات باستخدام مخططات البيانات بين المقابس.
افتراضيًا، تكون أي بيانات مرسلة مرتبة وموثوقة، ويُسمح بتقسيمها إلى عدة حزم UDP ويتم دمجها مرة أخرى على جانب جهاز الاستقبال ويتم ضمان تسليمها.
جميع حزم UDP التي يتم إرسالها لها البنية التالية:
إنه اختيارك لتحديد كيفية نقل البيانات. يمكن تهيئته عن طريق تحديد علامات لطرق الإرسال. كلهم موجودون في Proto4jPacket
. Flag
.
الأعلام التالية متوفرة:
اسم | قيمة | معنى |
---|---|---|
CONFIRMATION | 0x01 | يشير إلى أن هذه الحزمة هي مؤشر على تلقي حزم أخرى بنجاح. مطلوب لموثوقية الإرسال. بشكل عام، للاستخدام الداخلي فقط. |
PARTIAL | 0x02 | يشير إلى أن حزمة UDP هذه هي جزء من حزمة أكبر. عند استخدامها مع علامة CONFIRMATION معًا، فإنها تشير إلى أنه تم تسليم جزء من حزمة أكبر. |
UNORDERED | 0x04 | يشير إلى أنه يمكن التعامل مع هذه الحزمة خارج الترتيب. |
UNSIGNED_BODY | 0x08 | افتراضيًا، يتم توقيع جميع الحزم المرسلة باستخدام CRC32 ، ولكن بالنسبة للحزم التي تحمل هذه العلامة المحددة سيتم توقيع رأس الحزمة فقط. وهذا يعني أن الحزم قد تحتوي على بايتات غير صالحة (على الرغم من عدم ضمان فقدان البيانات). |
UNRELIABLE | 0x10 | وضع علامة على هذه الحزمة على أنها لا تتطلب تأكيدًا. في حالة عدم استلام المتلقي لهذه الحزمة، لن يفعل المرسل شيئًا حيال ذلك. |
INDIVISIBLE | 0x20 | حزم UDP محدودة الطول، لذا يقوم Proto4J بتقسيم البيانات الضخمة إلى عدة حزم أصغر. تشير هذه العلامة إلى أنه في حالة تجاوز الحزمة الحد الأقصى لحجم الحزمة الفردية، سيتم طرح استثناء بدلاً من إجراء التقسيم. |
لا يتم دعم المصافحة أو اختبار الاتصال على هذا المستوى ولكن يمكنك إعداد معالجات الحزم الخاصة بك باستخدام طريقة Proto4jSocket
.setInitialPacketHandler(BiConsumer<C, Proto4jPacket>)
. لا يتم وضع علامة على الحزم القادمة إلى هذه النقطة أبدًا بعلامات CONFIRMATION
أو PARTIAL
، لذا فإن جميع مثيلات Proto4jPacket
التي تتم معالجتها هناك تحتوي على البيانات الدقيقة التي يرسلها المرسل (حتى علامة UNSIGNED_BODY
).
أيضًا، عند بدء تشغيل المقبس، سيتم إرجاع CompletionStage<Void>
مما قد يساعدك في بدء منطق الاتصال بين المقابس.
عندما تكون على وشك إنشاء مثيل لأي مأخذ توصيل في Proto4J، يتعين عليك تمرير سلاسل العمليات العاملة والمعالج إلى مُنشئ المقبس.
يتم استخدام العمال فقط لقراءة البيانات من المقبس.
تُستخدم المعالجات للتعامل مع المنطق عند ظهور حزمة جديدة.
هذه واجهة ذات مستوى أعلى من المستوى السابق. لبدء العمل معه، قم بإلقاء نظرة على Proto4jHighServer
و Proto4jHighClient
أو تطبيقاتهما الأساسية: BaseProto4jHighServer
و BaseProto4jHighClient
.
عندما يتفاعل العميل مع الخادم في البداية فإنه يبدأ المصافحة . بعد اكتماله، سيقوم الخادم والعميل بإجراء اختبار الاتصال لبعضهما البعض لضمان عدم فقدان الاتصال.
وعلى النقيض من المستوى المنخفض ، يمكنك إرسال حزم عالية المستوى عبر الشبكة ليس فقط عن طريق معالجة البايتات الأولية ولكن أيضًا باستخدام كيانات معقدة. للقيام بذلك، قم بإنشاء فصلك الخاص الذي يمتد EnumeratedProto4jPacket
أو CallbackProto4jPacket
. كل ما عليك فعله لجعله يعمل هو تنفيذ طرق write(Buffer)
read(Buffer)
وتسجيل الحزمة الخاصة بك في PacketManager
على كلا الجانبين.
هناك أيضًا فئة PacketHandler
بديلة تعمل مع تلك الحزم بدلاً من Proto4jPacket
s.
إنه سيناريو شائع انتظار استجابة بعض الحزم للحزم المرسلة. تم بالفعل تنفيذ هذه الوظائف على هذا المستوى. يمكنك تحديد الحد الأقصى لوقت الانتظار والتعامل مع الاستجابة بالطريقة التي تريدها. يمكن القيام بذلك عن طريق إرسال الحزمة الأولية باستخدام HighChannel
. طريقة sendWithCallback(CallbackProto4jPacket)
.
فيما يلي قائمة بخصائص النظام التي يمكن استخدامها للتأثير على طريقة تصرف الوحدات داخليًا. يتم تحديد كافة قيم الوقت بالمللي ثانية.
اسم | القيمة الافتراضية | وصف |
---|---|---|
proto4j.maxDatagramSize | 508 | الحد الأقصى لحجم مخطط البيانات المسموح به. انتبه إلى أنه يحسب حجم حزمة UDP بالكامل. |
proto4j.maxSequenceNumber | 2_000_000_000 | الحد الأقصى للرقم التسلسلي للحزمة. عندما يصل العداد الداخلي إلى هذه القيمة، سيتم إعادة تعيينه إلى الصفر. |
proto4j.reliabilityThreshold | 20 | تأخير الحزم غير المؤكدة (والتي لم يتم وضع علامة عليها بعلامة UNRELIABLE ). |
proto4j.callbacksRegistryDelay | 100 | المعدل الذي تقوم فيه عمليات فحص تسجيل عمليات الاسترجاعات باسترداد عمليات الاسترجاعات التي انتهت مهلتها. |
proto4j.callbacksInitialDelay | 500 | إنه الوقت الافتراضي المستخدم عند إرسال حزمة وانتظارها عندما لا يتم تحديد وقت الانتظار بشكل صريح. |
proto4j.highTimeout | 10_000 | إذا لم يتلق الخادم أي حزم من العميل لفترة طويلة، فسوف يقوم بفصل الأخير. |
proto4j.highPingDelay | 1_000 | إذا أشار الخادم إلى عدم وجود أي استقبال أو إرسال إلى العميل لفترة طويلة، فسوف يرسل الرد إلى الأخير وينتظر حزمة ping. |
هذه واجهة برمجة تطبيقات ذات مستوى أعلى مقارنة بالمستوى العالي . بدلاً من تنفيذ الحزم يدويًا والتعامل معها، فإنك تعمل عبر الخدمات.
لبدء العمل معه، استخدم RpcServer
و RpcClient
.
يتم استخدام الخادم في هذا المستوى فقط لأغراض التوجيه ولكن العملاء يعملون كمستخدمين للخدمة ومنفذين.
تتكون الخدمة من الواجهة وأجزاء التنفيذ. كمستخدم خدمة، يمكنك الحصول على مثيل واجهة الخدمة عبر RpcClient
.getServiceManager().getService(Class<S>)
. سيتم نقل جميع أساليبها إلى التطبيقات المسجلة وسيتم تنفيذها عن بعد.
لإنشاء الخدمة الخاصة بك، ابدأ بالواجهة وقم بالتعليق عليها باستخدام @Proto4jService.
يُسمح لواجهة الخدمة بأن تحتوي على طرق افتراضية وثابتة ولكن يجب أن يكون نوع الإرجاع الخاص بها void
أو قابلاً للتسلسل أو CompletionStage
من الأنواع السابقة. بالإضافة إلى ذلك، يجب أن تكون جميع الوسائط قابلة للتسلسل.
الأنواع القابلة للتسلسل هي كما يلي:
String
و UUID
@AutoSerializable
BufferSerializable
List
Set
Map
للأنواع القابلة للتسلسل إذا كان يجب تنفيذ إحدى الطرق على جميع تطبيقات الخدمة المسجلة، فيجب أن يتم التعليق عليها بـ @Broadcast
إلا أن هذه الأساليب يمكنها فقط إرجاع void
أو CompletionStage<Void>
.
افتراضيًا، عند استدعاء الطريقة، سيتم تنفيذها على تطبيق عشوائي. إذا كنت تريد التحكم في توزيع التنفيذ، قم بتمييز بعض وسائط الطريقة باستخدام @Index
: كلما تم استدعاء الطريقة، سيتم تحديد التنفيذ بناءً على رمز التجزئة للوسائط المحددة.
عندما يتم تسجيل الخدمة، يتم تحويل جميع الطرق إلى معرف عدد صحيح. لا يمكن أن تكون هناك طريقتان بنفس المعرف ولكن قد يحدث مثل هذا الموقف. للتعامل معها، قم بتعليق الطريقة باستخدام @MethodIdentifier
بمعرف ثابت محدد بشكل صريح.
عندما قمت بالفعل بإنشاء واجهة خدمة، قم الآن بإنشاء تنفيذها وتسجيلها باستخدام RpcClient
.getServiceManager().registerService(Class<S>, I)
.
السيناريو الشائع هو وجود واجهة خدمة على مجموعتين من العملاء مع التنفيذ على واحدة منهما فقط.
هذه طبقة ذات مستوى أعلى فوق RPC الأساسي.
عند إنشاء واجهة خلفية موزعة (أي خدمات صغيرة)، فمن الممارسات الجيدة تقليل عدد نقاط الفشل. هناك نقطة فشل واحدة فقط في المخطط الموضح في القسم السابق وهي مثيل خادم واحد. Conclave عبارة عن مجموعة من الخوادم التي تعمل في وقت واحد.
جميع الخوادم في Conclave متصلة ببعضها البعض ولكن كل عميل متصل فقط بخادم واحد. يتم توزيع استعلامات RPC وتوجيهها عبر الشبكة بالكامل بحيث لا داعي للقلق بشأنها.
لبدء العمل مع Conclave ، قم بإلقاء نظرة على RpcConclaveServer
و RpcConclaveClient
. لإنشاء مثيل لأي منها، سيتعين عليك تمرير List<InetSocketAddress>
- قائمة بنقاط الوجهة لجميع الخوادم.
أما بالنسبة لوحدة النقل ، فهناك مجموعة من خصائص النظام التي يتم البحث عنها في وحدة RPC .
اسم | القيمة الافتراضية | وصف |
---|---|---|
proto4j.conclaveWorkers | 2 | عدد سلاسل العمليات المستخدمة من قبل كل عميل من العملاء الداخليين للخادم (والتي يتم استخدامها للوصول إلى الخوادم الأخرى). |
proto4j.conclaveHandlers | 2 | عدد مؤشرات ترابط المعالج المستخدمة من قبل كل عميل من العملاء الداخليين للخادم (والتي يتم استخدامها للوصول إلى الخوادم الأخرى). |
proto4j.conclaveTimeout | 1_000 | الحد الأقصى للوقت الذي سينتظر فيه الخادم حتى تتم عملية الاتصال مع الخادم الآخر. وإلا فإنه سيعتبر الأخير بمثابة اتصال غير قيد التشغيل، مما يؤدي إلى إنهاء محاولات الاتصال الخاصة به، وفي هذه الحالة لن يتم إعادة تشغيل الاتصال إلا في حالة طلب من اتصال آخر عند بدء تشغيله. |