Выбор бд для хранения списка, с быстрой записью и удалением элементов?
Существует некий объект А и существуют подписчики на изменение этотого объекта. Объект А может менятся очень часто (иногда даже чаще 1 раза в секунду), и поэтому выборка списка его подписчиков должна работать довольно быстро. Подписчики также могут довольно часто подписываться и отписывать на получение обновлений по любому из объектов.
На данный момент в системе не бывает одновременно больше чем 400 объектов А, а количество подписчиков не превышает 600 в среднем и 1000 в пике (ожидаем рост). Из практики будет получатся так, что на небольшое количество объектов А (<10%) будет подписаны большая часть клиентов (100%), в то время как на оставшиеся объекты подписки может и не быть вовсе.
Сообственно вопрос: в чем лучше всего это все хранить? какую структуру данных сделать? ну и что почитать, потестить?
Первое что приходит в голову взять Redis и по ключу идентификатору А.id хранить список идентификаторов подписчиков. Однако боюсь начнут возникать проблемы с изменением списка после очередной подписки/отписки.
Можно хранить все в традиционной РСУБД, но тогда будут тормаза при получении списка.
ps. На данный момент у нас такая реализация, что клиенты (подписчики) самы интерисуются переодически не поменялось ли чего. Вроде все не плохо, но иногда клиенты страдают от того что не вовремя получают информацию о изменениях. Ну и потом, хочется поэксперементировать.
pps. А может быть я все усложняю, и достаточно просто будет хранить все в отдельном приложении массивом в мапе, или что-ниубудь подобное. Хотя будет обидно если все это нечаяно упадет. Разрабатыватся вероятно будет на golang, так что подойдут варианты со встроенными решениями.
Слышали по персистентные данные и резервное хранение? Думаю что список подписчиков должен храниться в них. Если хост, обрабатывающий подписки не один, то как их синхронизировать?
laxikodeje: Откройте Википедию, вбейте в поле поиска In-memory database, удивитесь тому, что это устоявшийся термин.
Окей, всеведущий, поведуй мне, как синхронизировать состояние данных в памяти программы на golang для N>2 изолированных физически узлов.
Подозреваю, что оверхед и стоимость добавления в архитектуру редиса/memcached/... меньше, чем реализация того же функционала с нуля.
Как у вас с теорией графов? Каждая ветвь - отдельный объект, в графе из задачи их больше 24.000 сейчас.
СУБД спасает, снимая головную боль хранения и синхронизации данных.
Как у вас с теорией графов? Каждая ветвь - отдельный объект, в графе из задачи их больше 24.000 сейчас.
Что у вас с ПРАКТИКОЙ?
Вы в курсе, что графы довольно плохо ложатся на архитектуру распространенных СУБД?
Да, есть специальные иерархические СУБД, но вы хоть раз в жизни такую лично видели? Используют для всех задач универсальные РСУБД или всяческие key-value и т.п. Но не специализированные иерархические.
Реализовывать в РСУБД или в Tarantool/Redis полноценную работу с графами - это куча кода, и не оптимально по быстродействию.
Насчет этого "страшного" количества - 24000. Вы видимо, в прошлом учебном году ознакомились с областью АРИФМЕТИКИ, называемой комбинаторикой и теперь вам нравится все считать? Но опять таки, если мы вернемся к ПРАКТИКЕ - 24000 это не 24 млн.. Для современных компьютеров - такое количество объектов ерунда, это всего лишь мелкая доля секунды их работы.