محدد عقدة بتجزئة الالتقاء
أسند مفتاحًا إلى عقدة من قائمتك: يذهب user:42 بين cache-a وcache-b وcache-c إلى cache-a ويبقى هناك ما دامت العقد والبذرة لم تتغير. تظهر درجة كل عقدة لتراجع سبب الاختيار. مجاني في متصفحك.
- مجاني
- يعمل في متصفحك
- دون تسجيل
- بياناتك لا تغادر جهازك
شغّل الأداة مجانًا
مثال محلول
- Key
- user:42
- العقد
- cache-a, cache-b, cache-c
- البذرة
- المحدد
- cache-a
- عدد العقد
- 3
تجزئة الالتقاء، وتُعرف أيضًا باسم highest random weight hashing، تسند كل مفتاح إلى عقدة واحدة بالضبط من المجموعة الحية دون حلقة عقد افتراضية. لكل عقدة مرشحة يدمج الخوارزمية المفتاح مع معرّف تلك العقدة، ويرتّب الدرجات ويختار الفائز. عند انضمام عقدة أو مغادرتها تتحرك فقط المفاتيح التي كانت تفضّل العقدة المغادرة أو التي تفضّل الآن الوافد الجديد؛ ويبقى الباقي في مكانه، فتظل معدلات إصابة التخزين المؤقت وملكية الشظايا مستقرة أمام تغيّر العضوية. يقبل هذا المحدد مفتاح توجيه وقائمة معرّفات عقد وبذرة عنقود اختيارية وأوزانًا موجبة اختيارية، ثم يعيد العقدة المختارة مع جدول الدرجات الكامل حتى يتسنّى لكم تدقيق الموضع أو اختباره.
كيف تختار تجزئة الالتقاء عقدة لمفتاح
شاعت التجزئة المتسقة فكرة وضع المفاتيح على حلقة بحيث لا يعيد إضافة عقدة أو إزالتها تعيين سوى جزء صغير من المفاتيح. تحل تجزئة الالتقاء مشكلة موازنة الحمل نفسها بعقد أبسط: لكل عقدة في مجموعة العضوية الحالية احسبوا درجة تعتمد فقط على المفتاح وهوية تلك العقدة، ثم اختاروا العقدة ذات أعلى درجة. يعكس الاسم الكلاسيكي «highest random weight» أن التجزئة تتصرف كوزن شبه عشوائي لكل زوج.
ولأن درجة العقدة A لا تعتمد أبدًا على وجود B، فإن إزالة B تؤثر فقط على المفاتيح التي كان B فائزها سابقًا؛ ويظل الباقي يفضّل الناجي نفسه. إضافة عقدة C تسرق فقط المفاتيح التي تسجّل درجة أعلى مع C مما مع مالكها السابق. خاصية الحد الأدنى من الاضطراب هذه هي سبب استخدام المخازن المؤقتة ونقاط POP الطرفية وقواعد البيانات المجزأة للالتقاء عندما تريدون ملكية متوازنة دون حلقة كبيرة من العقد الافتراضية.
ينفّذ هذا الطرف HRW غير الموزون بمزج FNV-1a بطول 32 بت من بذرة اختيارية والمفتاح ومعرّف كل عقدة: التجزئة غير الموقّعة هي الدرجة، فالمقارنات صحيحة ومستقرة. عند تزويدكم بأوزان موجبة موازية لقائمة العقد يتحول الخوارزمية إلى HRW موزون: تُسقط التجزئة على فترة وحدوية u في (0,1] وتصبح الدرجة u مرفوعة إلى واحد على الوزن، فتفوز العقد الأثقل أكثر مع بقاء كل شيء حتميًا بالكامل. تُكسر التعادلات — نادرة مع 32 بت لكنها ممكنة — باختيار معرّف العقدة الأصغر معجميًا حتى لا يختلف عميلان أبدًا.
أين يبرهن محدد عقدة الالتقاء قيمته
يستخدم مطوّرو التطبيقات محدد عقدة بتجزئة الالتقاء لتثبيت جلسات المستخدم أو شظايا الكائنات أو عدّادات حد المعدل على خلفية مستقرة دون إقامة حلقات ZooKeeper أو مكتبات تجزئة متسقة ضخمة. تربط فرق CDN والحافة متعددة المناطق مفاتيح المحتوى بنقاط POP حتى تبقى ألفة التخزين المؤقت بعد التوسع. توجّه أساطيل الألعاب وإنترنت الأشياء معرّفات الأجهزة إلى عمال المحاكاة وتعيد ربط الجزء فقط الذي كان يفضّل عقدة غادرت.
يمكن لخطوط بيانات تقسّم مفاتيح بأسلوب Kafka بين المستهلكين محاكاة تغييرات العضوية دون اتصال بإدخال قوائم عقد مرشحة في الدالة النقية نفسها التي سيستدعيها العمال. حافظوا على معرّفات عقد قصيرة ومستقرة، وثبّتوا جداول درجات ذهبية في التكامل المستمر، فتحصلون على قرارات موضع قابلة للتكرار للعروض والعاملين الطرفيين وخطط التحكم الإنتاجية دون اختراع حلقة تجزئة خاصة بكم.
حالات الاستخدام
ألفة التخزين المؤقت والشظايا
اربطوا مفاتيح الكائنات أو المستخدمين بنسخ التخزين المؤقت أو شظايا قاعدة البيانات بحيث لا يعيد تغيّر العضوية إلا المفاتيح التي كانت تفضّل العقدة المضافة أو المحذوفة.
توجيه حافة متعدد المناطق
اختاروا POP أو عاملًا من قائمة حية وسليمة لكل مفتاح محتوى، مع أوزان اختيارية عند تفاوت السعة بين المناطق.
تجارب إعادة التوازن دون اتصال
مرّروا قوائم عقد مخططة إلى المحدد الحتمي نفسه في CI لقياس عدد المفاتيح التي ستتحرك قبل تغيير عضوية الإنتاج.
الأسئلة الشائعة
ما هي تجزئة الالتقاء (highest random weight)؟
تقيّم كل زوج (مفتاح، عقدة) بتجزئة وتختار أعلى درجة. تتحرك فقط المفاتيح التي كانت تفضّل عقدة محذوفة أو تفضّل عقدة مضافة حديثًا؛ ويبقى الباقي.
كيف تختارون عقدة لمفتاح؟
أرسلوا key وnodes (معرّف عقدة فريد واحد أو أكثر). حقل selected في الاستجابة هو العقدة الفائزة.
بماذا تختلف عن التجزئة المتسقة؟
تضع التجزئة المتسقة المفاتيح والعقد الافتراضية على حلقة. لا يحتاج الالتقاء إلى حلقة ولا عقد افتراضية: فقط قائمة العقد الحية وتجزئة المفتاح مع العقدة، مما يبسّط تحديثات العضوية.
هل يمكن أن تختلف سعات العقد؟
تنتقل الطريقة إلى HRW موزون (u مرفوعة إلى 1/الوزن) فتفوز العقد الأثقل أكثر مع بقائها حتمية.
ماذا يحدث لبقية المفاتيح عند إزالة عقدة؟
تبقى حيث كانت. تعتمد درجة كل عقدة على المفتاح وعلى تلك العقدة فقط، لذلك لا تنتقل عند إزالة عقدة إلا المفاتيح التي كانت تفوز بها، ولا تأخذ العقدة الجديدة إلا المفاتيح التي تحصل معها على درجة أعلى.
أدوات ذات صلة
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/dev/rendezvous-hash \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"key":"user:42","nodes":["cache-a","cache-b","cache-c"]}'const res = await fetch("https://api.kit.forhosting.com/dev/rendezvous-hash", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"key": "user:42",
"nodes": [
"cache-a",
"cache-b",
"cache-c"
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/rendezvous-hash",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"key": "user:42",
"nodes": [
"cache-a",
"cache-b",
"cache-c"
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/rendezvous-hash", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"key":"user:42","nodes":["cache-a","cache-b","cache-c"]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"key":"user:42","nodes":["cache-a","cache-b","cache-c"]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/rendezvous-hash", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"key": "user:42",
"nodes": [
"cache-a",
"cache-b",
"cache-c"
]
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.rendezvous_hash",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |
ملاحظات تقنية
التنفيذ parse النقي حتمي عبر المتصفح وواجهة API، ولا يستهلك رموز نموذج، ولا يصل إلى الشبكة أبدًا.
عقد الإدخال وشكل الاستجابة وقواعد التحقق
الجدول الكامل مقصود: غالبًا تحتاج حِزم اختبار الحمل ومراجعات الشيفرة إلى إثبات سبب هبوط مفتاح على مضيف معيّن. مثال: key user:42 مع nodes cache-a وcache-b وcache-c ينتج اسم ذاكرة مؤقتة واحدًا مختارًا لا يتغيّر حتى تتغيّر العضوية أو البذرة. اقرنوا المحدد بفحوصات الصحة لديكم — مرّروا فقط معرّفات سليمة في nodes — حتى تخرج المضيفات الفاشلة من سباق الدرجات دون منطق خاص داخل التجزئة. أرسلوا جسم JSON يتضمن key (سلسلة غير فارغة بعد التقليم؛ الاسم البديل object_key) وnodes (مصفوفة من واحد إلى ألف معرّف عقدة مميز غير فارغ؛ الاسم البديل members). البذرة الاختيارية seed (الاسم البديل salt) ملح نصي يُسبق المفتاح حتى تتمكن عناقيد مستقلة من تعيين مفتاح الأعمال نفسه بطرق مختلفة دون تصادم في جدول الدرجات؛ احذفوها أو مرّروا سلسلة فارغة إن لم يلزم ملح. الأوزان الاختيارية weights مصفوفة أعداد منتهية موجبة بنفس طول nodes؛ احذفوها لالتقاء متساوي الوزن. المفاتيح الفارغة وقوائم العقد الفارغة والإدخالات null والمعرّفات المكررة والأوزان غير الموجبة أو طول weights الذي لا يطابق nodes تفشل بـ invalid_input ولا تُفوتر. عند النجاح تعيد الاستجابة key وseed، وتسمّي العقدة المختارة، وتبلغ node_count، وتضبط method على rendezvous_hrw أو weighted_rendezvous_hrw، وتعيد scores: مصفوفة كائنات لكل منها node وweight وscore وعدد hash الصحيح الأساسي، مرتّبة تنازليًا حسب score ثم تصاعديًا حسب اسم العقدة.
أين يبرهن محدد عقدة الالتقاء قيمته
تستفيد مواقع المحتوى التي تنافس على «rendezvous hashing» أو «highest random weight» من أداة مجانية في المتصفح تطابق إجاباتها واجهة API المدفوعة بايتًا بايت. ولأن التنفيذ parse نقي من المستوى A، تكلف كل مكالمة ناجحة السعر الأساسي المنشور $0.002 بلا رموز نموذج ولا شبكة صادرة؛ والتحقق الفاشل لا يستهلك الرصيد.
أسئلة تقنية
كم يكلف محدد عقدة تجزئة الالتقاء؟
أداة المتصفح مجانية. تستخدم طلبات API رصيد KIT المدفوع مسبقًا بسعر $0.002 لكل مكالمة ناجحة؛ والإدخال غير الصالح لا يُفوتر.