WedX - журнал о программировании и компьютерных науках

Сервис/база данных/технология для эмуляции объекта длинной последовательности (не UUID)

Я ищу стороннюю службу, чтобы создать/эмулировать что-то похожее на объект базы данных последовательности Postgres.

Мне нужна эта потокобезопасная функциональность, чтобы иметь возможность запрашивать следующее уникальное значение Long. Я собираюсь использовать это значение в качестве суррогатного ключа для объектов приложения Spring Boot/Neoj4.

Главный критерий - скорость. Он должен быть довольно быстрым и долговечным (не только в памяти, но и сохраняться на жестком диске, чтобы выжить после сбоев и перезапусков)

Кроме того, я не хочу использовать UUID, потому что мне нужно отображать эти идентификаторы в параметрах URL-адреса моего веб-приложения, а в случае UUID мои URL-адреса выглядят ужасно. Я хочу использовать простые длинные значения для идентификаторов.

Не могли бы вы предложить какую-нибудь базу данных/сервис/технологию, которую можно установить на моем сервере и получить уникальные идентификаторы?

ОБНОВЛЕНО

Можно ли реализовать отказоустойчивую (сохраняемую) последовательность AtomicLong с помощью Apache ZooKeeper или Hazelcast? Если да, то есть ли реализация этого решения с открытым исходным кодом, которую можно загрузить и использовать?


  • Я не уверен, что это такая уж хорошая идея. Во-первых, скорость. Генерация UUID типа 1 намного быстрее, чем сохранение Neo4j. Накладные расходы незначительны, если рассматривать всю операцию. Во-вторых, эстетика. Чтобы избежать «уродливых» UUID, вы думаете об обмене на техническое решение с большим количеством движущихся частей, режимы отказа которых, вероятно, не полностью понятны (при всем уважении к Snowcast), и которое требует наличия кластера Hazelcast. YMMV, но это не та сделка, на которую у меня возникло бы искушение. 17.02.2017
  • Спасибо за ваше мнение. Ну... не могли бы вы предложить альтернативное решение, как получить надежные длинные значения (например, StackOverflow) для моих веб-адресов? 18.02.2017

Ответы:


1

Что-то вроде Snowflake (https://github.com/twitter/snowflake/releases/tag/snowflake-2010) или снежный покров (https://github.com/noctarius/snowcast) может вас заинтересовать.

16.02.2017
  • Спасибо за Ваш ответ. Snowcast выглядит очень интересно, но непонятна отказоустойчивая часть этого сервиса. Например, в моей системе я не могу потерять номер последовательности (например, после сбоя Snowcast). Как Snowcast может гарантировать, что номер последовательности не будет потерян? 16.02.2017
  • Например, я использую MongoDB в своем проекте. Могу ли я использовать MongoDB в качестве внутреннего хранилища данных для Hazelcast, чтобы сделать Snowcast отказоустойчивым? 17.02.2017
  • Snowcast использует часть миллисекунд внутри идентификатора, поэтому после сбоя вашей службе нужно будет вернуться в ту же самую мс, чтобы попасть в ситуацию, когда вы повторно сгенерируете тот же идентификатор. ID строятся из NODEID|MILLIS_OF_EPOCH|COUNTER 17.02.2017
  • Спасибо ! Не могли бы вы также показать здесь в комментарии типичное значение идентификатора (просто в качестве примера), сгенерированное Snowcast? 17.02.2017
  • Это просто длинное значение (положительное/отрицательное — представьте, что это беззнаковое длинное) с этими тремя компонентами, упомянутыми выше, встроенными в определенные биты длинного. Единственная важная вещь, которую вам нужно помнить: если ваша база данных не поддерживает ulong и не допускает отрицательных длинных значений, у вас возникнут проблемы, кроме того, она должна работать хорошо. Кстати, Hazelcast просто используется для автоматического назначения идентификаторов узлов. 17.02.2017
  • Несколько слов о предыстории, это было разработано для системы игрового сервера, чтобы предоставлять уникальные идентификаторы в большом масштабе и с низкой задержкой, к сожалению, проект умер, не успев завершить :) 17.02.2017
  • @ноктариус. Предложенное решение довольно крутое. Возможно ли иметь повторяющиеся сгенерированные идентификаторы, если после перезапуска приложения EPOCH устанавливается на ту же отметку времени, что и до перезапуска? Например: EPOCH_OFFSET = 1388534400000 (2014-01-01--00:00:00) 20.02.2017
  • Временная метка эпохи должна быть создана только один раз и использоваться повторно навсегда. Представьте, что это смещение временной метки unix, чтобы она не заканчивалась быстро. Теоретически вы можете установить смещение на 0 и получить временную метку unix;) Другой вариант получения повторяющихся временных меток - назначить один и тот же идентификатор узла несколько раз. Представьте себе случай, когда клиент отключается, но все еще работает, кластер перезапускается, но клиент не подключается повторно, идентификатор узла может быть переназначен. Есть некоторая рандомизация, чтобы снизить шанс, но она все еще существует. 21.02.2017
  • @noctarius спасибо за это разъяснение. Еще один вопрос - временная метка эпохи должна создаваться только один раз для каждого приложения? Я имею в виду, должен ли я настроить значение эпохи, например, в файле свойств моего приложения, или я должен указывать новое значение эпохи при каждом запуске приложения? Например - SnowcastEpoch snowcastEpoch = SnowcastEpoch.byTimestamp(new Date().getTime()); return snowcast.createSequencer("sequence_generator", snowcastEpoch); 21.02.2017
  • Нет, это должны быть постоянные значения в течение всего срока службы приложения. Однако несколько секвенсоров в приложении могут иметь разные эпохи :) 22.02.2017

  • 2

    Если вам нужны только числа, почему вы не хотите объединять 2 длинных значения из UUID (most + least)

    В соответствии с вопросом вашего комментария: Да, конкатенированное (не суммированное!) Значение из этих методов с заполненными числами, ведущими от 0 к полной длинной длине, будет гарантировать все то же самое, что и UUID само по себе (потому что это вид UUIDs).

    15.02.2017
  • Спасибо за Ваш ответ. Это очень интересная идея. Будет ли она работать и гарантировать псевдоуникальность, как UUID? 15.02.2017
  • К сожалению, значение результата также слишком длинное. Например, 40281202173729666258912159000741813434. Я все еще ищу отказоустойчивый сервис, который сможет быстро генерировать уникальную последовательность для AtomicLong. 16.02.2017
  • Новые материалы

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..


    Для любых предложений по сайту: wedx@cp9.ru