Дублирование хранилища сообщений для систем обмена сообщениями
Во многих проектах подсистем для приложений обмена сообщениями (Twitter, Facebook и т. Д.) Я замечаю дублирование того, где хранится история сообщений пользователя. С другой стороны, они используют индексатор токенов, такой как ElasticSeach или Solr. Это хорошо для поиска. С другой стороны до сих пор используют какую-то БД для истории. Зачем дублировать? Почему один и тот же экземпляр ES/Solr/EarlyBird нельзя использовать для истории? Это на самом деле в состоянии.
2 ответа
Правда, ES не является базой данных как таковой и никогда не будет. Но никто не говорит, что вы не можете использовать это как таковое, и многие люди действительно делают. Это действительно зависит от ваших конкретных вариантов использования, и в конечном итоге все зависит от компромиссов, которые вы готовы сделать, чтобы удовлетворить ваши конкретные потребности. Как и в случае практически любой технологии в целом, не существует универсального подхода, а с ES (и тому подобным) он ничем не отличается.
Основным источником правды не обязательно может быть реляционная СУБД, и они не обязательно "дублируют" данные в том смысле, в каком вы имели в виду, это может быть что угодно, что имеет копию ваших данных и позволяет вам перестроить ваши индексы ES в случае, если что-то идет не так. Я видел много разных "источников правды". Это может быть просто:
- ваши сырые плоские файлы, содержащие ваши исторические журналы или бизнес-данные
- Кафка темы, которые вы можете воспроизвести в любое время легко
- снимок, который вы регулярно принимаете у ES
- реляционная БД
- Вы называете это...
Дело в том, что если по какой-либо причине что-то пойдет не так (и это произойдет), вы захотите воссоздать индексы ES, будь то из реальной БД, из резервных копий или из необработанных данных. Вы должны увидеть это как страховочную сетку. Даже если у вас есть только БД MySQL, у вас обычно есть резервная копия, поэтому вы уже каким-то образом "дублируете" данные.
Одна вещь, о которой вам нужно подумать, однако, при разработке вашей системы, это то, что вам необязательно иметь всю полноту данных в ES, поскольку ES - это механизм поиска и аналитики, вы должны хранить там только то, что есть. необходим для поддержки ваших потребностей в области поиска и аналитики и возможности воссоздания этой информации в любое время. В конце концов, ES - это просто подсистема всей вашей архитектуры, как и ваша БД, ваша очередь сообщений или веб-сервер.
Также стоит прочитать: Использование ElasticSeach в качестве основного источника для части моей БД
Обычная проблема заключается в следующем: вы хотите искать, а в идеале вы хотите попробовать индексировать данные другим способом (например, стереть индекс и попробовать новый удивительный анализатор, который вы забыли включить изначально). Отделение источника данных и индекса друг от друга делает систему менее связанной. Вы не боитесь, что потеряете данные в Elasticsearch/Solr.
Я обычно категорически против называть Elasticsearch/Solr базой данных. Так как на самом деле это не так. Например, ни одна из них не поддерживает транзакции, что усложняет вашу жизнь, если вы хотите обновить несколько документов, следуя стандартной реляционной логике.
И последнее, но не менее важное: одна из самых сложных операций в Elasticsearch/Solr - это получение сохраненных значений, так как это не слишком оптимизировано для этого, особенно если вы хотите вернуть 10k документов одновременно. В этом случае также поможет отдельный источник данных, поскольку вы сможете возвращать только совпадающие идентификаторы документов из Elasticsearch/Solr, а затем получать необходимый контент из источника данных и возвращать его пользователю.
Резюме просто - Elasticsearch/Solr следует больше рассматривать как поисковые системы, а не как хранилище данных.