1.使用同步的通信方式来解决多个服务之间的通信
同步的通信方式会存在性能和稳定性的问题
2.使用异步的通信方式
针对于同步的通信方式来说,异步的方式,可以让上游快速成功,极大提高了系统的吞吐量,而且在分布式系统中,通过下游服务多个服务的分布式事务的保障,也能保障业务执行之后的最终一致性。
目前消息队列中间件选型有很多种
消息队列大致分为两种
重topic(kafka、rocketMQ、ActiveMQ):整个broker,依据topic来进行消息的中转,在重topic的消息队列里必然需要topic的存在
轻topic(rabbitMQ):topic只是其中的一种中转模式。
在生产者和消费者中没有使用broker,直接使用socket进行通信。
这个Broker主要就是控制消息的中转,生产者把消息发送给它就结束了自己的任务了,Broker则把消息主动推送给消费者(或者消费者主动轮询)
./kafka-topics.sh --create --zookeeper 10.10.6.44:2181 --replication-factor 1 --partitions 1 --topic test
./kafka-topics.sh --list --zookeeper 10.10.6.44:2181
发送消息
kafka自带了一个producer命令客户端,可以从本地文件中读取内容,或者我们也可以以命令行中直接输入内容,并将这些内容已消息的形式发送到kafka集群中。在默认情况下,每一行会被当做一个独立的消息,使用kafka的发送消息的客户端,指定发送到kafka服务器地址和topic
./kafka-console-producer.sh --broker-list 10.10.6.44:9092 --topic test
消费消息
对于consumer kafka同样也携带了一个命令行客户端,会将获取到内容在命令行中进行输出,默认是消费最新的消息,使用kafka的消费者消息的客户端,从指定kafka服务器的指定topic中消费消息
./kafka-console-consumer.sh --bootstrap-server 10.10.6.44:9092 --topic test
./kafka-console-consumer.sh --bootstrap-server 10.10.6.44:9092 --from-begining --topic test
单播消息
在一个kafka的topic中,启动两个消费者,一个生产者,问:生产者发送消息时,这条消息是否可以同时被两个消费者消费?
./kafka-console-consumer.sh --bootstrap-server 10.10.6.44:9092 --consumer-property group.id=testGroup --topic test
多播消息
不同的消费组订阅同一个topic,那么不同的消费组中只有一个消费者能收到消息,实际上也是多个消费组中的多个消费者收到了同一个消息
./kafka-console-consumer.sh --bootstrap-server 10.10.6.44:9092 --consumer-property group.id=testGroup1--topic test
#查看当前主题下有哪些消费组
./kafka-consumer-groups.sh --bootstrap-server 10.10.6.44:9092 --list
#查看消费组中的具体信息:比如当前偏移量、最后一条消息的偏移量、堆积的消息数量
./kafka-consumer-groups.sh --bootstrap-server 10.10.6.44:9092 --describe --group testGroup
重点关注一下几个信息