datastax java_使用DataStax Java驱动程序的最佳实践

引言

如果您想开始建立自己的基于Cassandra的Java程序,欢迎!

也许您已经参加过我们精彩的DataStax Academy课程或开发者大会,又或者仔细阅读过Cassandra Java驱动的文档。相比示例程序,现在是时候步入真实世界、处理实际案例了。

那么问题来了:Java驱动提供了各种设置选项,在开始使用时我们需要知道哪些一般准则,以及从什么最佳实践入手,从而轻松构建一个在生产环境中有复原力的、实时的、高性能应用呢?

这是个好问题!基于大量和您类似的Datastax客户中所累积的经验,本文档将列出一些基本的准则。

在DataStax Java 驱动中有很多的旋钮和拉杆,并且每一个都有其存在的理由。但是绝大部分的用户不需要深入了解那些更深奥高阶的功能,所以这篇文档将会重点介绍大部分应用程序会遇到的一般情况。在这个过程中,我们会再详细介绍提到的高级选项,但是他们确实不是一般情况。 现在就让我们先关注一下主要情况吧。

在本文开始前,我们默认您已经对这些内容有所了解:客户端与服务端架构的应用程序、Cassandra基础,还有Datastax Java驱动的主要元素,例如Sessions(会话)、Statements(语句)、Results sets(结果集)、Rows(行)。附录中提供了一些帮助您熟悉这些概念的资源。

最佳实践

这一部分介绍了使用DataStax Java驱动创建一个Java程序的最佳实践方法。部分最佳实践的方法也可以运用到其它的开发语言中(及其关联的DataStax驱动),但是在本文中我们将会专注于Java驱动。我们将最佳实践的方法分为4组:总体指导、建立连接、查询语句和查询结果。

总体指导

当今最佳的实践方法是使用最新的DataStax Java驱动,即版本4.x。虽然3.x版本的驱动仍然可用,且在必要情况下依然是个不错的选择,本文会把重点放在4.x的驱动。

使用您正在使用的Datastax Java驱动主要版本(比如4.x)中最新的细分版本(比如截止2020年8月,4.x中的4.9.0或3.x中的3.10.0)。

在多数据中心部署的情况下,我们建议一个应用实例仅与单独一个数据中心挂钩使用。换句话说,如果您要将您的应用部署到多个地区,您应该部署多个应用,每个地区分别对应一个应用。每一个应用都应将驱动程序连接到每一个当地的数据中心(如下图所示),并且应使用Global Load Balancer(全局负载平衡器)在多个应用实例中引导流量。

如果Cassandra在一个地区的数据中心无法访问(如脱机以进行定期维护),Global Load Balancer会将流量导到其它数据区域中的应用程序实例。

还有一个最佳的实践方法是使用与数据库查询有关的指标来对应用程序进行监测。这个会非常有助于测试应用程序的查询性能。更多关于驱动程序监测的指标请参考这里。在默认情况下所有的指标收集功能都是处于禁用状态。如果您需要它们,您需要在建立连接的时候启用。详见下面信息。

如果一个监测指标处于启用状态,您可以通过Session#getMetrics()方法获得指标内容。

建立与数据库的连接

用于建立与Cassandra的连接的CqlSession对象,可以通过很多不同的方式进行配置,包括通过配置文件或者编程方式建立连接——我们建议使用配置文件。当我们与Cassandra创建连接时,以下是一些最重要的考虑因素:

请使用单独的CqlSession:一个应用程序只使用一个单独的CqlSession对象来连接到数据库。在一些更复杂的情况下,有可能会有多个Class,每一个Class 都需要连接到一个CqlSession。在这种情况下,我们希望它们能使用同一个CqlSession,因此最好将其创建为单例模式。一个比较常见的方法是使用依赖注入框架,例如Spring。

在application.conf里设定选项:将所有非默认的选项在jar包里的application.conf文件中进行定义。这个设置文件根据类型安全配置框架(Typesafe Config framework)设置参数。reference.conf文件包括了所有的默认值,同时由于application.conf是基于它衍生出来的,因此您只需在applicaiton.conf里显式地指出任何想要复写的值。

遵循您安全性的最佳做法,同时使用适当的身份验证和SSL选项。更多关于身份验证和SSL加密内容请参照DataStax Java驱动的文档。

在创建连接的时使用多个接触点(Contact Points)。这样的话,您的应用即使在单个(或多个节点)脱机时仍可与数据库建立连接。特意选择(或避免)种子节点并没有任何益处。

datastax-java-driver.basic.contact-points = ["127.0.0.1:9042","localhost:9042"]

只提供一个数据中心的接触点,这个数据中心会被设为本地的数据中心(如下所示)。

没必要将一个数据中心所有的节点都设置为接触点。当驱动程序建立初始连接后,它会发现集群中所有剩下的节点,并通过负载平衡策略与这些节点建立直接的连接。

当创建CqlSession时,您可以通过编程的方式设置连接点,这会复写application.conf中的参数。

CqlSession.builder().addContactPoint(new InetSocketAddress("127.0.0.1", 9042));

使用默认的负载平衡策略:当建立连接时,使用默认参数DefaultLoadBalancingPolicy。此负载平衡策略会更有效且相对平衡地调用节点进行查询。

当建立连接时,显式地指定使用本地的数据中心。

datastax-java-driver.basic.load-balancing-policy.local-datacenter = dc1

当创建CqlSession时,您也可以通过编程的方式设置本地数据中心,这会复写application.conf中的参数。

CqlSession.builder().withLocalDatacenter("dc1")

显式地将一致性级别设定为LOCAL_QUORUM并将默认串行一致性设为LOCAL_SERIAL。不然,默认的一致性是LOCAL_ONE,默认串行一致性级别为SERIAL,这些通常都不建议使用。

datastax-java-driver.basic.request.consistency =LOCAL_QUORUM

datastax-java-driver.basic.request.serial-consistency = LOCAL_SERIAL

不要将默认查询幂等性设置为true。其默认值为false,请保留它。设置为true很危险,因为一些操作是通过幂等查询自动完成的,但事实上不是所有操作都是幂等的。因此,请针对每次查询显式明确地设置幂等查询操作。

请在advanced.metrics中启用合适的指标,从而启用指标收集功能。因为没有一个“启用所有指标”的选项,您必须明确指出您需要启动的每一个指标。

advanced.metrics.session指定会话级(session-level)指标。下面列出了一些您可能感兴趣的advanced.metrics.session.enabled中的指标:

advanced.metrics.session.enabled = [bytes-sent, bytes-received, connected-nodes, cql-requests, cql-client-timeouts, cql-prepar

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值