我有一个用例将数据从kafka索引到elasticsearch。 Elasticsearch有一个批量API,它在一个API调用中将多个消息捆绑在一起以进行索引。它比在每条消息上逐个编制索引要有效得多。
我正在使用Clojure来做到这一点。当然,我想使用core.async,消耗来自kafka的消息并输入到一个频道,缓冲一段时间,或者当频道有足够的消息,然后在一个elasticsearch批量API调用中对它们进行索引。
问题是只要有一条消息进入,就会发出通道输出信号。
一个简单的解决方案是在阻塞队列中缓冲来自通道输出的传入消息,但这听起来像是打败了使用通道的目的。为什么不使用没有通道的阻塞队列?
是否有使用渠道进行批处理的建议?谢谢。
答案 0 :(得分:0)
需要编写阻塞队列,并且需要正确的同步,这已经在运行时为通道完成了。 在你的情况下我会使用make(chan [] * Message,buffer),所以你同步循环收集消息进行切片,直到达到必要的长度或达到超时,然后将其发送到通道中的进程。这将非常简单,并且不需要任何复杂的数据结构。