【问题标题】:Jedis - high performing servlet - settingsJedis - 高性能 servlet - 设置
【发布时间】:2015-12-11 14:12:24
【问题描述】:

我们在 Elastic Beanstalk 上运行一个 servlet,我们连接到 ElastiCache,它运行得相当好,但现在我们在高峰期获得了高 CPU 负载 (50%),并且正在考虑对其进行优化。

目前我们正在像这样使用 Jedis:

try (Jedis jedis = new Jedis(Global.CLUSTER_ENDPOINT, 6379, 10000);) {              
    jedis.hset(f.dayOfFile, "content", f.xmlFile);
}

我们遇到的一个问题是活动连接数突然上升到 8400 并且没有下降。似乎没有任何影响,但仍然想知道它是如何达到如此高的水平以及这是否会影响性能。

所以我的问题是:

  1. 我们是否应该使用另一个看起来更好维护的库,例如 lettuce (https://github.com/mp911de/lettuce)?
  2. 或者我们应该使用连接池?我们每天有数百万个请求,所以如果这会引入池中的最大连接数等其他问题,我们有点害怕切换到连接池?
  3. 或者还有什么我们应该调整的?

【问题讨论】:

  • 您可以尝试#2 [在某些测试环境中],而不是害怕它。拥有一个未绑定(非 poopled)的连接数对我来说似乎是个坏主意。或者你也有无限量的new Thread()s?
  • @zapl 模拟 300 万用户以确保它在高峰期不会失败有点困难。但如果这是推荐的设置方式,我会更改它并查看一些规模测试解决方案以确保它按预期工作。
  • 是的,这很难。但是,如果您不想长期陷入大量没人想再次接触的代码中,则需要一种预先验证更改的方法(以及一种紧急回滚的方法)。不幸的是,据我所知,Beanstalk 没有像 programmableweb.com/news/… 这样的版本的 A/B 测试等功能,但您应该能够在负载均衡器级别执行类似的操作。还有一些负载测试服务和框架。

标签: java redis amazon-elastic-beanstalk jedis amazon-elasticache


【解决方案1】:

如果您想“只”做一些 Redis,Jedis 是一个小巧而漂亮的库。它的速度非常快,因为它只做它的工作。 Jedis 的可扩展性受到线程/连接的限制,并且连接不是线程安全的。您可以使用连接池,我坚信这将有助于解决您的问题。

上面的代码在每次调用时都会与 Redis 连接/断开连接。汇集可能会有所帮助。 jedis 使用 commons-pool2,这是一个非常好的连接池实现,但与其他框架相比速度较慢。

您可以自己实现连接池,以改善高连接数问题。

您询问了 lettuce:对于 lettuce,您只需要一个连接,因为 lettuce 连接是线程安全的(只要您不使用阻塞操作 [BLPOP] 或事务 [EXEC/DISPATCH]) .生菜比绝地稍慢,但提供:

  • 线程安全
  • 连接断开时自动重新连接和命令缓冲
  • 异步 API

在使用 Redis Standalone(或 Redis Master/Slave)时,lettuce 不提供 read-from-slave。 ElastiCache 也没有故障转移/服务发现(仅 Redis Sentinel 支持故障转移)。

一个缺点可能是 lettuce 的命令模式,因为 lettuce 会为您发出的每个命令创建一个命令。根据使用情况,命令可能会占用很大一部分内存。但是,这取决于您的观点。

HTH,马克

【讨论】:

  • 是的,Jedis 在连接池方面工作得非常好并且性能很好。简单又好用,它“正常工作”。 Jedis 也与 Sentinel 完美配合,重新连接到奴隶。到目前为止没问题。
【解决方案2】:

试试Redisson,它支持AWS Elasticache服务,并为Redis提供连接池和最方便的Java api。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-03
    • 2013-12-08
    • 2020-05-26
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多