kafka和MQ的區別:
1)在架構模型方面,
RabbitMQ遵循AMQP協議,RabbitMQ的broker由Exchange,Binding,queue組成,其中exchange和binding組成了消息的路由鍵;客戶端Producer通過連接channel和server進行通信,Consumer從queue獲取消息進行消費(長連接,queue有消息會推送到consumer端,consumer循環從輸入流讀取數據)。rabbitMQ以broker為中心;有消息的確認機制。
kafka遵從一般的MQ結構,producer,broker,consumer,以consumer為中心,消息的消費信息保存的客戶端consumer上,consumer根據消費的點,從broker上批量pull數據;無消息確認機制。
2)在吞吐量,
rabbitMQ在吞吐量方面稍遜於kafka,他們的出發點不一樣,rabbitMQ支持對消息的可靠的傳遞,支持事務,不支持批量的操作;基於存儲的可靠性的要求存儲可以采用內存或者硬盤。
kafka具有高的吞吐量,內部采用消息的批量處理,zero-copy機制,數據的存儲和獲取是本地磁盤順序批量操作,具有O(1)的復雜度,消息處理的效率很高。
3)在可用性方面,
rabbitMQ支持miror的queue,主queue失效,miror queue接管。
kafka的broker支持主備模式。
4)在集群負載均衡方面,
rabbitMQ的負載均衡需要單獨的loadbalancer進行支持。
kafka采用zookeeper對集群中的broker、consumer進行管理,可以注冊topic到zookeeper上;通過zookeeper的協調機制,producer保存對應topic的broker信息,可以隨機或者輪詢發送到broker上;並且producer可以基於語義指定分片,消息發送到broker的某分片上。
轉載:https://www.cnblogs.com/csuliujia/p/9379402.html
Springboot集成kafka代碼展示:
對象:
package com.example.demo; import com.alibaba.fastjson.JSON; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; @Component public class Product { @Autowired private KafkaTemplate kafkaTemplate; public void send(String name){ User u=new User(); u.setName(name); u.setAge(11); kafkaTemplate.send("user", JSON.toJSONString(u)); } }
生產者:
package com.example.demo; import com.alibaba.fastjson.JSON; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Component; @Component public class Product { @Autowired private KafkaTemplate kafkaTemplate; public void send(String name){ User u=new User(); u.setName(name); u.setAge(11); kafkaTemplate.send("user", JSON.toJSONString(u)); } }
消費者:
package com.example.demo; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Component; import java.util.Optional; @Component public class Consumer { @KafkaListener(topics = "user") public void consumer(ConsumerRecord consumerRecord){ Optional<Object> kafkaMassage = Optional.ofNullable(consumerRecord.value()); if(kafkaMassage.isPresent()){ Object o = kafkaMassage.get(); System.out.println(o); } } }
測試:
package com.example.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import javax.annotation.PostConstruct; @SpringBootApplication public class DemoApplication { @Autowired private Product product; @PostConstruct public void init(){ for(int i=0;i<10;i++){ product.send("afs"+i); } } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
配置文件:application.properties
spring.application.name=kafka-user server.port=8080 #============== kafka =================== # 指定kafka 代理地址,可以多個 spring.kafka.bootstrap-servers=localhost:9092 #=============== provider ======================= spring.kafka.producer.retries=0 # 每次批量發送消息的數量 spring.kafka.producer.batch-size=16384 spring.kafka.producer.buffer-memory=33554432 # 指定消息key和消息體的編解碼方式 spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer #=============== consumer ======================= # 指定默認消費者group id spring.kafka.consumer.group-id=user-log-group spring.kafka.consumer.auto-offset-reset=earliest spring.kafka.consumer.enable-auto-commit=true spring.kafka.consumer.auto-commit-interval=100 # 指定消息key和消息體的編解碼方式 spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
配置文件:pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <!--引入kafak和spring整合的jar--> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.2.7.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.44</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
注意:此處有版本問題,springboot 2.x得用kafka 2.x
另外:記得開啟zookeeper+kafka
安裝參考:https://www.cnblogs.com/lnice/p/9668750.html (windows版本)
https://blog.csdn.net/xuzhelin/article/details/71515208 (Linux版本)