【问题标题】:Couchbase - Bulk insert via Java SDK - How to scale with Akka?Couchbase - 通过 Java SDK 批量插入 - 如何使用 Akka 进行扩展?
【发布时间】:2015-04-22 15:21:33
【问题描述】:

我的任务是扩展一个系统,我需要在 Couchbase 服务器中执行大量插入操作。顺便说一句,我正在使用 Couchbase Server 2.5,以及 Couchbase Java Client 1.4.4

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

几个问题:

  1. 我应该如何考虑这里的资源争用?假设一台 4 核机器,理论上只有 4 次写入可以以真正并行的方式发生。
  2. 让我们假设我的 Couchbase 集群在优秀的硬件上运行,并且应该能够非常快速地扩展到超过 100K 的请求。我的理论是我可能会在客户端遇到瓶颈,如果我遇到了......
  3. 我应该如何扩展我的客户端以便能够执行这么多(或更多写入)而不超时?有没有办法在客户端调整我的线程池?
  4. 最后,我是否应该引入某种方式来限制我的写入,从而减轻 couchcbase 客户端上的“压力”?
  5. 在考虑如何正确、优雅地扩展它,避免出现意外错误/资源泄漏时,我还缺少什么?

谢谢!

【问题讨论】:

    标签: java akka couchbase


    【解决方案1】:

    首先,在撰写本文时,您应该真正切换到新的 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.x Java 客户端在高负载和故障情况下实际上会抛出 BackpressureException。您需要处理它,可能需要某种指数退避重试。
    5. 切换到 2.x 客户端版本,阅读所有文档 (http://docs.couchbase.com/developer/java-2.1/java-intro.html) :)

    【讨论】:

    • 为了补充大卫所写的内容,大小将很重要,尤其是要处理您所说的写入速度。由于您使用的是 Couchbase 2.5,这意味着您使用的是企业版,您应该联系您的 Couchbase 销售代表,解决方案工程师可以在他们的流程中帮助您进行调整。如果您没有或不认识销售代表,只需访问网站,那里有一个表格可以联系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    相关资源
    最近更新 更多