有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从java应用程序到elasticsearch的多线程并发输出

我正在研究是否可以使用传输客户端和批量上传API将多个线程同时输出到elasticsearch。具体地说,我想让多个传输客户端或批量上传api实例在它们自己的线程上运行,并处理elasticsearch的输入。我想这样做的具体原因是,我可以创建一个负载平衡算法来有效地处理大量json消息。我已经在谷歌上搜索了一段时间,找不到关于这类事情的任何文档,也找不到其他人提出类似问题。另外,我对elasticsearch是新手。有没有人对此有什么见解,有哪些文献可以分享,或者有一个好的起点?谢谢


共 (1) 个答案

  1. # 1 楼答案

    如何实现这一点的一个想法是使用一个静态类作为弹性客户机对象的包装器。然后,您可以在使用ExecutorService执行的任何代码中生成多个线程。ExecutorService包含许多实用程序方法,这些方法在链接中有详细说明,可能会帮助您管理处理。然后,这些线程将调用静态类,在处理时获取客户机对象,准备它们的批量请求,然后发送它们

    如果你是懒惰的,你可以让循环无限期地执行,让睡眠调用来帮助防止过载

    需要注意的几个注意事项:

    1)注意Elasticsearch的Thread pool and queue sizes。不要以硬件无法处理的速度向ES提交数据。如果向ES提交数据的速度过快,导致队列过载,则批量请求将被中止。不要增加大容量队列的大小,除非您需要并且知道您的硬件可以保持并防止过载。如果遇到路障,增加排队人数只会推迟不可避免的事情。如果您正在重载批量,请在代码中包含一种限制请求的方法

    2)按类型/索引对批量请求进行分区。我不是100%确定ES如何在后台处理批量请求,但我注意到在一个批量请求中将大量请求推送到不同索引时,队列大小中存在一些不一致的行为。Elasticsearch对请求进行分区以防止大量无用的seq并优化碎片/节点遍历是有道理的,但我注意到,如果混合使用,队列大小会增加得更快