SUNRPC تمكن من الرسائل ذات الاتجاه الواحد (تدفق / تجميع؟)
سؤال
لدينا بعض الخدمات التي تستخدم SUNRPC على Linux (RHEL 4/5) التي نرغب في تسريعها.
لا تتطلب مكالمة RPC الخاصة بنا أي قيمة إرجاع ، على الرغم من أن طبيعة RPC ، يتم إرسال ACK دائمًا على أي حال. يقدم هذا الكمون الذي أصبح مؤخرًا مشكلة - عند تشغيله على نقل موثوق (TCP) ، نأمل أن نتجنب الكمون الذي أدخله رد RPC.
مستندات هنا يشير إلى أن Solaris لديه الكلمة الرئيسية "Oneway" التي تمكن ذلك تمامًا ، على الرغم من أن Linux/GLIBC لا يبدو أنه يدعم هذا.
هل هناك أي طريقة يمكننا تمكين "التدفق" أو المراسلة في اتجاه واحد مع SUNRPC على Linux؟
المحلول
هناك تغييران يجب إجراؤهما على المعيار clnt_call()
الاحتجاج من أجل الحصول على مكالمة RPC غير متزامنة (أو "مجنونة") NULL
ويجب أن تكون حجة المهلة صفرًا ، أي
static struct timeval ZERO_TIMEOUT = { 0, 0 };
static char clnt_res;
memset((char*)&clnt_res, 0, sizeof(clnt_res);
if (clnt_call(clnt, messageType, (xdrproc_t)xdr_messageType_t, (caddr_t)argp,
(xdrproc_t)NULL, (caddr_t)&clnt_res, ZERO_TIMEOUT) != RPC_SUCCESS) {
...
}
نصائح أخرى
إذا كانت مكتبة RPC الخاصة بك لا تدعم اتصال "Oneway" ، فيمكنك دائمًا استخدام نمط تجمع الموضوع لمحاكاة نوع "النار ونسيان" نوع من الاحتجاج في برنامجك. بدلاً من إرسال المكالمة عن بُعد مباشرة (وبالتالي الحظر حتى تتلقى إجابة) ، يمكنك enqueue أمر هذا يقوم بالاتصال البعيد في مؤشر ترابط مختلف ويسمح لك البرنامج الرئيسي بالمتابعة مع تنفيذها.