繁体   English   中英

订阅 Redis Stream 阻止其他请求与 Vert.x 的连接

[英]Subscription to Redis Stream Blocks Connections for Other Requests With Vert.x

我正在使用 Vert.x(及其 Redis 客户端库)实现一个能够侦听 Redis 流的应用程序。 为此,我的应用程序中有n实例订阅了它。 Vert.x 文档指出:

一个常见的配置是将池的最大大小设置为可用 CPU 内核的数量

该池提供用于请求到 Redis 的连接。例如,池大小可以为 6。如果尝试订阅的实例超过 6 个,前 6 个没有问题,但之后尝试订阅的所有实例都不能,因为没有留下任何联系。

难道“常用配置”都是硬限制? 我也可以有 10k 连接吗?

Vert.x 是否提供了一种方法来为不同的目的(用于订阅和其他东西)分离池?

是否有解决方案来处理主要用于 Vert.x 的 stream 订阅的许多连接?

不幸的是,Vert.x 文档没有提供太多信息。

Vert.x redis 客户端将尝试使用与 redis 的最少连接数,因为这通常会为 vert.x 和 redis 提供更好的性能。

当使用简单的命令和响应时,例如, SET key value ,那么池有好处,因为它重用连接并且整个流程更快。 但是,对于发布/订阅,最好使用专用连接(而不是池)

Redis.createClient(
  vertx,
  "redis://localhost:6379")
  .connect()
  .onSuccess(conn -> {
    // use the connection to subscribe...
  });

如果您希望使用订阅池(这在性能方面没有任何优势),您仍然可以,但需要调整默认值以允许比平时更多的连接。 您将使用RedisOptions object 执行此操作:

new RedisOptions()
    .setConnectionString("redis://localhost:7006")
    // allow at max 128 connections to redis
    .setMaxPoolSize(128)
    // allow 512 connection requests to queue waiting
    // for a connection to be available.
    .setMaxWaitingHandlers(512))

这意味着将有 128 个连接随时可用,并且对于 go 通过正在使用的连接的命令,客户端会将它们排队到 512,直到连接可用,否则将开始失败命令。 通常,这可以防止您的服务器过载 Redis 或耗尽内存/套接字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM