【发布时间】:2014-07-04 15:14:45
【问题描述】:
这是我们想出的。通过使用 3 值状态列。
0 = Not indexed
1 = Updated
2 = Indexed
将有 2 个工作......
Job 1 将选择 status = 0 的前 X 条记录,并将它们弹出到 RabitMQ 等队列中。 然后消费者会将这些记录批量插入到 ES 中,并将 DB 记录的状态更新为 1。
对于更新,因为我们可以控制我们的数据...更新该特定记录的 SQL 存储过程会将其状态设置为 2。Job2 将选择状态 = 2 的前 x 条记录并将它们弹出到 RabitMQ。然后消费者会将这些记录批量插入到 ES 中,并将 DB 记录的状态更新为 1。
当然,我们可能需要“排队”的中间状态,这样所有作业都不会再次获取相同的记录,但如果尚未完成,则不应运行相同的作业。排队记录被更新的机会微乎其微。因为更新只在一天结束时发生,通常是第二天。
所以我知道有河流(但已被弃用并且可能不像 ETL 那样灵活)
我想将我的 SQL 服务器中的记录批量插入到 Elasticsearch。
编写某种预定的批处理作业,无论是 ETL 还是任何其他工具都无所谓。
从 id > lastIdInsertedToElasticSearch 的表中选择这将允许以预定的时间间隔将最新记录加载到 Elasticsearch 中。
但是如果在 SQL 服务器中更新了一条记录呢?什么是跟踪 SQL 服务器中更新记录然后在 ES 中推送更新记录的好模式?我知道 ES 在放置相同的 ID 时有文档版本。但似乎无法可视化模式。
【问题讨论】:
-
这对您来说是不是太复杂了?与仅使用队列进行写入/更新并让应用程序推入队列相比,您从该解决方案中获得的特别优势是什么?我之所以这么问,是因为您似乎必须破解某种锁才能实现此目的,因为您已经提到您将必须保持“排队”的状态。老实说,您的应用程序将在此解决方案中看到的唯一性能提升不是写入 RabbitMQ,如果您的应用程序和 Rabbit 在同一个数据中心,这将可以忽略不计。
-
所以我建议你选择简单而不是这一分钟的性能提升,因为它只会在出现问题时让你的生活变得困难,并且难以调试你的应用程序和消费者逻辑。
-
状态栏不是为了性能。了解数据库中的哪些记录已经插入到 Elasticsearch 中,以及数据库中的哪些记录已更新,以便批处理作业可以更新 Elasticsearch。
标签: elasticsearch merge-replication