美文网首页
flink +redis PubSub 的问题

flink +redis PubSub 的问题

作者: NazgulSun | 来源:发表于2020-12-29 10:44 被阅读0次

    Redis pub sub 缓存区的限制

    对于Redis服务器的输出(也就是命令的返回值)来说,其大小通常是不可控制的。有可能一个简单的命令,能够产生体积庞大的返回数据。另外也有可能因为执行了太多命令,导致产生返回数据的速率超过了往客户端发送的速率,这是也会导致服务器堆积大量消息,从而导致输出缓冲区越来越大,占用过多内存,甚至导致系统崩溃。

    所幸,Redis设置了一些保护机制来避免这种情况的出现,不同类型的客户端有不同的限制参数。限制方式有如下两种:
    (1)、大小限制,当某一个客户端的缓冲区超过某一个大小值时,直接关闭这个客户端的连接;
    (2)、持续性限制,当某一个客户端的缓冲区持续一段时间占用过大空间时,会直接关闭客户端连接。
    我们来看看配置文件关于客户端输出缓冲区的配置:
    client-output-buffer-limit normal 0 0 0
    client-output-buffer-limit slave 256mb 64mb 60
    client-output-buffer-limit pubsub 8mb 2mb 60

    所以在大数据量使用 pub sub 时候,很容易被限制。

    我们的场景就是 一个 行情客户端,使用了 pub/sub 功能,在flink source 中订阅了 行情,结果收到很少的数据。
    就是因为超过了 buffer 限制。修改限制之后
    client-output-buffer-limit pubsub 0 0 0
    就可以收到全部的数据,但是 flink 端 依旧无法完整的处理数据。

    可能就是使用 redis 做 pub sub,还是有点问题。使用 分布式的kafka 可能会好一些。

    flink 窗口 和状态

    我们在flink 窗口中计算因子,一般 的windowFunction 会把所有的 数据缓存到 state 中,如果数据太大也会对性能有影响。
    使用一些 reduce, aggreate 等 聚合函数,可以实现部分增量聚合,对性能的影响会稍微少一些。

    性能的问题

    使用python 的 Redis sub 我们发现,是完全可以处理 4000个股票3s 一次的 行情数据的。
    可是使用flink 默认配置的时候,能够接受到的数据量大大减少?
    这个问题从根源上还是没有想清楚?

    配置了 parallelism.default =30 后,这种情况得到了很好的缓解。
    taskSlot = 6 之后, 刚好有30个slot 可以做并行。 这种情况可以很好的缓解。

    我的疑问是,为啥 redis 单个的节点就能做的事情, flink 之后反而需要多个节点来处理了?
    做一下测试就知道:
    本机, redis, 单机: java 2万/s 的吞吐
    本机, flinl 单机: flink,不 collection 2万/s 的吞吐
    本机, flinl 单机: flink,collection 2万/s 的吞吐

    统一网络:单一机器:python 20万/s 的吞吐。
    统一网络,单一机器, java 20 吞吐,没有任何区别。
    统一网络, fink para =1, 吞吐就是起不来。
    统一网络,flink 单机, 吞吐,20万/吞吐,完全没有问题

    吞吐之类的程序应该 没什么问题的。

    现在看下, snap 行情的每分钟的统计:
    上海就是5万的吞吐。
    加上 深证,每分钟要到10万,保险的是处理12万的吞吐。

    为啥,用了集群之后,单个吞吐反而下降了那么多。
    其实集群,上收到数据量也是一个吞吐,但是使用窗口之后。能够纳入到一个窗口中的就是另外算了。
    如果16万的数据,通过一些算子之后,再到窗口中,那么时间是算哪个?

    在ubuntu5上,读取的pub的速度和在ubuntu6上就有完全不同的差别。所以还是得分散。
    5-7万的吞吐。还是万兆网络。

    相关文章

      网友评论

          本文标题:flink +redis PubSub 的问题

          本文链接:https://www.haomeiwen.com/subject/wmlfoktx.html