• leechanx
    2019-11-04
    sendfile 在linux 2.1的时候,是文件与socket两个内核缓冲区间copy
    在更高linux版本,已经能从文件缓冲区直接写到网卡了,socket缓冲区省掉了
    
     18
  • 陆离
    2019-11-01
    并行消费那块有数据丢失的风险吧。
    server接收到数据返回给队列ack,然后丢给线程池,数据还没处理完这个节点挂掉了,数据不就全丢了。

    作者回复: 会有这个风险,不过为了提升性能,需要一些权衡

     4
     6
  • intomymind
    2019-11-01
    消费者接收到消息后,放入到线程池里面,那么在线程池里对消息处理完之后,如何实现返回ack给kafka呢

    作者回复: 为了性能可能要损失一些消息完整性

     2
     4
  • 仙道
    2019-11-06
    老师,关于消息队列的一个重要东西,您还没有讲到。
    消息的顺序性。比如订单消息要在配送消息消费之前消费
    对于这种问题,有因果一致性来解决。因果一致性的一种做法是,消息的编号递增,小的号码先消费,大的号码要在后消费。
    但是在分布式集群环境下,每个消费者消费的时候要把它的最大消息编号广播给其他消费者。
    这样一来的话,代价就比较高了。

    作者回复: 也可以比如在Kafka下,把要求严格顺序的消息写到一个partition

     4
     3
  • jun.hai
    2019-12-21
    老师,请教个问题:我们用的ActiveMQ隔一段时间后会出现,生产后消费时隔半个小时到一个小时的延迟,并大量也不大,这个怎么检查能找到根源?谢谢

    作者回复: 可以监控一下写入消息和处理消息的速率,看看是不是写入消息量级过大还来不及处理,还是说处理的慢了

    如果处理的慢了,那么要排查处理的链路上哪处是瓶颈

    
     1
  • Klaus
    2019-12-18
    数据库数据本身也是属于磁盘数据啊,为什么在存储的时候将数据库换成本地磁盘,qps会提高一个数量级呢?

    作者回复: 数据库是随机写,磁盘是顺序写

    
     1
  •  海大
    2020-02-06
    消息处理时避免耗时操作也很重要

    作者回复: 是的,必要时可以做多级队列

    
    
  • 每天晒白牙
    2019-12-22
    今日学习总结
    我们使用消息队列,一般会关注消息的延迟,然后优化消息的读写性能,但首先要做的是对延迟的监控,那怎么监控消息队列的延迟呢?
    1.通过消息队列的工具,来监控消息的堆积情况
    一般消息队列都会提供这种工具,拿kafka来说,可以通过 kafka-consumer-groups.sh 这个命令来监控堆积情况。主要关注【lag】列
    同时kafka会通过jmx暴露消息的堆积情况,所以可以使用jconsole这种工具进行查看

    2.通过生成监控消息的方式来监控延迟情况
    这种方式就是启动一个监控程序,并生产一种特殊的消息,比如是消息生成的时间戳,然后循环的写入到消息队列中,真正的消费者对于这种特殊的消息不进行处理,而监控程序会处理这种特殊的消息,通过比较消费到该消息的时间和生成该消息的时间差来判断是否有延迟

    那如何减少消息的延迟呢?
    1.优化消费端的代码以提升性能
    2.增加消费者的数量

    关于第2点对消息队列会有限制,比如对于kafka来说,在同一个分区下,消息只能被一个消费者【同一个consumer_group】消费,这样也是考虑到了多个消费者消费需要抢占锁,会有性能损失
    【topic的分区数量决定了消费者的并行度】
    所以想提高并行度就得增加分区,那如何不增加分区呢?可以在处理消息上做工作了,比如可以在一个消费者中增加处理消息的并行度,比如多线程的方式去处理,或者加入异步处理

    【这里有值得注意的,就是消费消息时消费线程的空转问题】
    消费端通过不断轮训去topic中拉取消息,就存在线程空转的情况,这里可以增加一个策略就是拉取不到消息,等待一会儿,等待时间可以是固定的。也可以是阶梯的,当然这样可能加重消息消费延迟情况

    消息队列本身读取性能提升可以从下面两个方面着手
    1.消息的存储
    2.零拷贝技术
    展开

    作者回复: 赞

    
    
  • hunterlodge
    2019-11-26
    老师,请问怎么采集每个consumer的JMX数据呢,让监控程序去连接每一个consumer应用吗?

    作者回复: 是的呢~

    
    
  • 李慢慢
    2019-11-20
    问一下,公司还在jdk6时代,但是用到了RocketMQ,上面的这些监控也能做吗·。

    作者回复: 可以的吧 ,RocketMQ也会提供一些工具

    
    
  • 刘伟
    2019-11-16
    能不能启用多个消费者放在同一个消费者组里来消费一个分区?这样是不是相当于启动多个消费者消费同一个分区了?

    作者回复: 对于Kafka来说是不行的

    
    
  • 云师兄
    2019-11-08
    请教老师kafka新版本offset通过主题方式替换zk,能提升多大的吞吐量,有没有量化的数据参考

    作者回复: 没有找到官方的benchmark

     1
    
  • 你净瞎说~
    2019-11-05
    老师,我想问一下,消息中间件的读写都是顺序的吗?写文件的时候会先写到pageCache中,然后往文件写,写文件的时候应该是一行一行写的吧?如果不写入pageCache直接写入文件,也是一行一行写的吧,有什么区别吗?比如说写到文件的第1万行了,再往后继续写,是可以快速定位到这个位置的吗?读取消息的时候也是读的文件,假如说读到了第1万行,再往后读,也是可以很快定位到这个1万行吗?java有没有api,比如说,我直接读取第1万行的数据?

    作者回复: 写文件一般都会写入pagecache 由操作系统来刷盘

     1
    
  • 旅途
    2019-11-04
    我想问一下老师发送特殊消息队列的那个 正常的消息里面不是有时间戳吗 用这个时间戳比较不行吗

    作者回复: 也可以

     2
    
  • chp
    2019-11-03
    老师,kafka的消费者端也是通过轮询的形式拉取消息?kafka是否也会出现空转的情况?

    作者回复: kafka本身不会空转,因为kafka消费端是拉模式,所以kafka是接受读取请求的

    
    
  • 电光火石
    2019-11-03
    零拷贝时,从内核缓冲区到socket缓冲区是否可以通过共享缓冲区的方式,再减少一次拷贝?谢谢!

    作者回复: 可以将描述符传输到socket缓冲区,这样可以减少一次拷贝

    
    
  • longslee
    2019-11-02
    打卡。嗯文中监控实战不错。 然后就是下面很多同学提到的丢给线程池处理丢失数据和线程池本身的堆积问题。 如果线程池方式不能避免丢失,那么客户端是否只有一条条的消费来处理消息呢,此时线程数完全受控与Kafka的partition数?

    作者回复: 消息处理程序一般是IO密集型的,所以可以提升线程数来提升并行处理能力

    
    
  • 阿土
    2019-11-02
    生成监控消息来监控业务消息是否有延迟,这种方式里面,监控程序在消费到业务消息怎么处理呢?老师能再详细说明一下嘛,感觉监控消息跟业务消息混在一起,不晓得怎么监控消费进度了

    作者回复: 监控程序会放弃业务消息
    监控程序和业务的应用程序使用的是不同的consumer group

    
    
  • Omer
    2019-11-01
    你先定义一种特殊的消息,然后启动一个监控程序,将这个消息定时地循环写入到消息队列中,消息的内容可以是生成消息的时间戳,并且也会作为队列的消费者消费数据。业务处理程序消费到这个消息时直接丢弃掉,而监控程序在消费到这个消息时,就可以和这个消息的生成时间做比较,如果时间差达到某一个阈值就可以向我们报警。


    老师,这里有个问题,你这么做是问了判断当前队列的延迟时间对吧,但是这样子做的话定时生成的时间戳和正式的任务混在一起了,这样不就给正常执行的业务处理程序增加了很多负担,会不会导致太多的这种任务导致对于正式的业务延迟更大?
    展开

    作者回复: 不会的,这样比如1分钟发送一个消息,相比于业务动辄每秒几十或者几百次请求来说太微不足道了

    
    
  • 高源
    2019-11-01
    老师请教问题经过排查发现客户端发的消息,服务器收的比较晚,造成超时,双方之间tcp socket通讯局域网,这种情况怎样解决啊

    作者回复: 局域网应该不会有大量超时,可以抓包看一下,也可以看看网卡是否有丢包

     1
    
我们在线,来聊聊吧