Я теряю множество возможных идентификаторов, ограничивая себя 10 ^ 4 вместо 10 ^ 6.
У нас все еще есть 10^4 * 16
идентификаторы всего .
Существует ли умный способ кодировать 15 уникальных узлов без ограничения возможных чисел?
Эта проблема аналогична распределенной хэш-таблице разбиению пространства ключей.Наиболее известное решение этой проблемы - создать множество виртуальных узлов, разделить пространство ключей между этими виртуальными узлами, а затем назначить эти виртуальные узлы физическим особым образом (циклический, случайный, по запросу и т. Д.).
Самый простой способ реализовать разделение пространства ключей - убедиться, что каждый узел генерирует такой идентификатор:
vnode_id = order_id % total_number_of_vnodes
Например, если у нас всего 3 vnodes [0, 1, 2], тогда:
vnode 0 must generate ids: 0, 3, 6, 9...
vnode 1 must generate ids: 1, 4, 7, 10...
vnode 2 must generate ids: 2, 5, 7, 11...
Если у нас есть 7 vnode [0, 1, 2, 3, 4, 5, 6], то:
vnode 0 must generate ids: 0, 7, 14, 21...
vnode 1 must generate ids: 1, 8, 15, 22...
vnode 2 must generate ids: 2, 9, 16, 23...
...
vnode 6 must generate ids: 6, 13, 20, 27...
Тогда все физические узлы должны отображаться на виртуальный визвестный и распространенный способ, например, отображение 1: 1:
physical node 0 takes vnode 0
physical node 1 takes vnode 1
physical node 2 takes vnode 2
отображение по требованию:
physical node 0 takes vnode 0, 3, 7 (many orders)
physical node 1 takes vnode 1, 4 (less orders)
physical node 2 takes vnode 2 (no orders)
Надеюсь, вы поняли идею.
В идеале у меня было бы 10 ^ 6 - 15 возможностей.
К сожалению, это невозможно.Учтите это: у нас есть 10 ^ 6 возможных идентификаторов и 15 различных узлов, каждый из которых генерирует уникальный идентификатор.
По сути, это означает, что так или иначе мы разделяем наши идентификаторы между узламикаждый узел получает в среднем 10^6 / 15
, что намного меньше, чем желательно 10^6 - 15
.
Используя описанный выше метод, мы все равно имеем в общей сложности 10^6
идентификаторов, но они будут распределены между vnode, которыев свою очередь будет сопоставлен с физическими узлами.Это лучшее практическое решение для вашей проблемы AFAIK.
Я ищу решение, которое не будет одинаково распределять диапазон для каждого идентификатора узла.Я ищу способ кодирования идентификатора узла в уже существующем уникальном идентификаторе, не теряя (в идеале) больше, чем количество узлов возможностей.
Не ожидайте чуда.Может быть много других хитростей, которые стоит попробовать.
Например, если Сервер и все Клиенты знают, что идентификатор следующего заказа должен быть 235, но скажем, Клиент 5 генерирует идентификатор заказа 240 (235 + 5) и отправляетэто к серверу.
Сервер ожидает идентификатор заказа 235, но получает идентификатор заказа 240. Итак, теперь сервер знает, что этот заказ поступает от клиента 5 (240 - 235).
Или мы можем попытатьсяиспользуйте другое поле для хранения идентификатора клиента.Например, если у вас есть время (ЧЧ: MM.SS), мы можем использовать секунды для хранения идентификатора клиента.
Просто несколько примеров, я думаю, вы поняли ...