最近手上的项目须要拉去kafka的消息进行消费,不过之前没使用过kafka,这两天安装及摸索使用了kafka,对于在一个服务里开启多个kafka的消费者来提升消费速度的问题上,目前本身已摸索清楚并测试经过,故记录下。git
一. 项目场景github
在分布式的情景下,有多个应用服务将消息推送到kafka的topic里,须要开发一个应用服务去拉去kafka的消息并进行消费,因为消息的生产速度很快,若是只开一个消费者去进行消费的话,会致使大量消息堆积于kafka,因此须要进行提高消费者的速度。vim
二. 提高消费者速度的手段负载均衡
- 开启多个kafka的消费者一块儿进行消费
- 对每一个kafka的消费者又开一个业务处理池
- 其余(逻辑优化、SQL优化等)
第二点和第三点已经作了优化了,因此还想从第一点进行优化,如下就对第一点的优化作一个详细描述。分布式
三. Kafka的基本知识测试
- Broker(代理者):Kafka集群中的机器/服务被成为broker, 是一个物理概念。
- Topic(主题):维护Kafka上的消息类型被称为Topic,是一个逻辑概念。
- Partition(分区):具体维护Kafka上的消息数据的最小单位,一个Topic能够包含多个分区;Partition特性:ordered & immutable。(在数据的产生和消费过程当中,不须要关注数据具体存储的Partition在那个Broker上,只须要指定Topic便可,由Kafka负责将数据和对应的Partition关联上)
- Producer(生产者):负责将数据发送到Kafka对应Topic的进程。
- Consumer(消费者):负责从对应Topic获取数据的进程。
- Consumer Group(消费者组):每一个consumer都属于一个特定的group组,一个group组能够包含多个consumer,但一个组中只会有一个consumer消费数据。
- Message(消息):传递的数据对象,主要由四部分构成:offset(偏移量)、key、value、timestamp(插入时间); 其中offset和timestamp在kafka集群中产生,key/value在producer发送数据的时候产生。
一个topic能够配置多个partition,produce发送的消息分发到不一样的partition中,consumer接受数据的时候是按照group来接受,kafka确保每一个partition只能同一个group中的一个consumer消费,若是想要重复消费,那么须要其余的组来消费。优化
四. 走过的那些弯路(也是为了测试)spa
- case 1:在一个应用服务里建立1个消费者,而后把该应用服务放2台机器去跑,最终也是只有一个服务能收到消息,只有关闭其一以后,另外一个服务才能收到消息,这不是我所指望的。
- case 2:在一个应用服务里建立3个消费者,每一个消费者的GroupID都不同,最终是这3个消费者都接收到了数据,这不是我所指望的。
- case 3:在一个应用服务里建立3个消费者,3个消费者的GroupID都是同样的,最终是只有一个消费者消费了消息,另2个消费者一直消费不到消息。
- case 4:修改kafka的配置文件(vim /usr/local/etc/kafka/server.properties),将num.partitions=1修改成num.partitions=5,并重启kafka,因为默认kafka的配置是一个topic只有一个partition,而kafka确保每一个partition只能同一个group中的一个consumer消费,当生产者推送消息时因为会负载均衡的分配到每一个partition(目前partition数量为5),因此当每一个partition都有数据时,应用服务在这种状况下一次最多能够消费5个数据,这样就提高了消费速度。这才是我想指望的。
五. 本身写的项目代理
报警监控:https://github.com/hzxgo/alarm_monitorserver
状态监控:https://github.com/hzxgo/state_monitor