中国在数码网站注册域名好>,杭州市做网站的公司,品川室内设计官网,高端建站收费选择索引策略很困难。 Elasticsearch 文档的确有一些一般性建议 #xff0c;并且有其他公司的 一些技巧 #xff0c;但这也取决于特定的用例。 在典型情况下#xff0c;您有一个数据库作为事实的来源#xff0c;并且有一个使事物可搜索的索引。 您可以采用以下策略#xf… 选择索引策略很困难。 Elasticsearch 文档的确有一些一般性建议 并且有其他公司的 一些技巧 但这也取决于特定的用例。 在典型情况下您有一个数据库作为事实的来源并且有一个使事物可搜索的索引。 您可以采用以下策略 随着数据的到来而建立索引–您可以同时插入数据库并建立索引。 如果没有太多数据这是有道理的。 否则索引将变得非常低效。 存储在数据库中并与计划的作业一起建立索引–这可能是最常见的方法并且易于实现。 但是如果要索引的数据很多则可能会出现问题因为必须使用数据库中的从到条件来精确地获取该数据并且索引落后于实际数据的秒数或分钟在计划的作业运行之间 推送到消息队列并编写索引使用方–您可以运行RabbitMQ之类的东西并让多个使用方轮询数据并为其编制索引。 这不是容易实现的因为您必须轮询多个项目才能利用批处理索引然后仅在成功执行批处理时将它们标记为已使用-有点交易行为。 对内存中的项目进行排队并定期对其进行刷新–这可能是好的且高效的但是如果节点死亡则可能会丢失数据因此您必须根据数据库中的数据进行某种运行状况检查 混合-结合以上内容 例如如果需要在以后充实原始数据并更新索引则可以在内存中对项目进行排队然后使用“存储在数据库中具有计划作业的索引”来更新索引并填写任何缺失的项目。 或者您可以在数据的某些部分出现时建立索引并对更活跃的数据类型使用另一种策略 我们最近决定实施“内存中队列”方法与另一方法结合使用因为无论如何我们都必须进行一些计划的后处理。 最初的尝试是使用Elasticsearch客户端提供的类BulkProcessor 。 逻辑很清晰–如果达到一定限制或以固定的时间间隔将索引请求存储在内存中并批量将其刷新到Elasticsearch。 因此最多每隔X秒最多每隔Y个记录将有一个批处理索引请求。 这样就可以实现近实时索引而不会给Elasticsearch带来太大的压力。 根据Elasticsearch的建议它还允许同时多个批量索引请求。 但是我们使用了BulkProcessor不支持的REST API通过Jest 。 我们试图堵塞而不是当前的本地一个REST索引逻辑虽然它几乎工作在这个过程中我们发现了一些令人担忧-在internalAdd方法该方法被调用每一个索引请求加入到大宗时间是synchronized 。 这意味着线程将阻塞等待彼此添加内容。 对于生产环境来说这听起来不太理想且有风险因此我们进行了单独的实施。 可以在这里看到– ESBulkProcessor 。 它允许多个线程同时刷新到Elasticsearch但是只有一个线程使用锁要从队列中使用以形成批处理。 由于这是一项快速的操作因此最好对其进行序列化。 并不是因为并发队列无法处理从中读取的多个线程而是可以 但是达到同时由多个线程形成批量的条件将导致几个小批量而不是一个大批量因此一次只需要一个消费者。 这不是一个大问题因此可以将其删除。 但重要的是要注意它没有阻塞。 这已经生产了一段时间了似乎没有任何问题。 如果由于负载增加或边缘情况而发生更改我将报告任何更改。 如果这是唯一的索引逻辑则必须重申该问题–您的应用程序节点可能会失败并且最终可能会导致Elasticsearch中的数据丢失。 我们不在那种情况下我不确定哪种方法是最好的补救方法–是在服务器发生故障的情况下对近期数据进行部分重新索引或者通过批处理检查是否没有数据库和索引之间不匹配。 当然我们还应该说您可能并不总是拥有一个数据库–有时Elasticsearch就是您用于数据存储的全部在这种情况下需要某种队列持久性。 最终目标是实现近乎实时的索引编制因为用户期望尽快看到他们的数据同时又不影响Elasticsearch集群。 “什么是对数据建立索引的最佳方法”这一主题非常重要我希望至少已经澄清了一点并且我们的贡献对于其他情况也很有意义。 翻译自: https://www.javacodegeeks.com/2019/12/near-real-time-indexing-with-elasticsearch.html