Couchbase-通过Java SDK批量插入-如何使用Akka进行扩展



我的任务是扩展一个需要在Couchbase服务器中进行大量插入的系统。顺便说一下,我使用的是Couchbase Server 2.5和Couchbase Java Client 1.4.4

我预计会从消息队列中接收大约10万条消息,我会将它们提取出来,然后尽快将这些消息保存到Couchbase中。我打算通过利用像Akka这样的并发框架来引入并发。我打算为每条消息生成新的参与者并进行持久化,因此在任何给定的时间点,理论上我都有可能让系统中有超过10万个参与者同时尝试通过Couchbase客户端持久化消息。

几个问题:

  1. 我应该如何看待这里的资源争用?假设一台4核机器,理论上只有4次写入可以以真正并行的方式进行
  2. 让我们假设我的Couchbase集群在优秀的硬件上运行,并且应该能够很快扩展到>100K的请求。我的理论是,我可能会在客户端遇到瓶颈,如果我遇到了
  3. 我应该如何扩展我的客户,使其能够在不超时的情况下完成那么多(或更多)写入?有什么方法可以在客户端调整我的线程池吗
  4. 最后,我是否应该介绍一些抑制写入的方法,以减轻couchbase客户端的"压力">
  5. 在思考如何正确、优雅地扩展它,避免意外错误/资源泄漏时,我还缺少什么

谢谢!

首先,在撰写本文时,您应该真正切换到新的Java客户端-2.1.2。它速度更快,依赖关系更少,并且更容易推理并发性。

  1. 这并不完全正确,因为客户端在内部缓冲操作,并且有几个IO线程批量处理工作队列。因此,您不受并发写入中核心数量的限制。看看这里的Java大容量插入示例:http://docs.couchbase.com/developer/java-2.1/documents-bulk.html
  2. 您可能会在客户端遇到CPU瓶颈,尤其是在序列化对象时。这里没有神奇的解决方案,你需要扩大规模
  3. 虽然您可以配置客户端工作线程数和各种其他参数,但您应该首先使用默认设置进行尝试。如果你看到一些不起作用的东西,你可以稍后尝试诊断和调整,但通常默认设置对大多数情况都很好。此外,由于客户端缓冲操作,因此通常不需要进行任何手动客户端池。您需要小心创建过多的客户端实例;例如,在您的案例中,您绝对不应该为每个参与者创建一个实例。您可以在此处找到所有高级配置选项的文档:http://docs.couchbase.com/developer/java-2.1/env-config.html
  4. 2.xJava客户端实际上在高负载和故障场景中抛出BackpressureException。您需要处理它,可能需要某种指数后退重试
  5. 切换到2.x客户端版本,阅读所有文档(http://docs.couchbase.com/developer/java-2.1/java-intro.html):)

最新更新