本篇內容介紹了“如何使用消息隊列”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
做網站、成都網站設計的關注點不是能為您做些什么網站,而是怎么做網站,有沒有做好網站,給成都創新互聯一個展示的機會來證明自己,這并不會花費您太多時間,或許會給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗,一切以用戶為中心。
已發布的消息保存在一組服務器中,稱為Kafka集群。集群中的每個服務器都是一個Broker。
通過Topic機制對消息進行分類,可以認為每個Topic就是一個隊列。
每個Topic可以有多個分區,主要為了提高并發而設計。相同Topic下不同Partition可以并發接收消息,同時也能供消費者并發拉取消息。有多少Partition就有多少并發量。
在Kafka服務器上,分區是以文件目錄的形式存在的。每個分區目錄中,Kafka會按配置大小及配置周期將分區拆分成多個段文件(LogSegment),每個段由三部分組成:
- 日志文件:*.log - 位移索引文件:*.index - 時間索引文件:*.timeindex
其中*.log
用于存儲消息本身的數據內容,*.index
存儲消息在文件中的位置(包括消息的邏輯offset和物理存儲offset),*.timeindex
存儲消息創建時間和對應邏輯地址的映射關系。
將分區拆分成多個段是為了控制存儲文件大小。可以很方便的通過操作系統mmap
機制映射到內存中,提高寫入和讀取效率。同時還有一個好處就是,當系統要清除過期數據時,可以直接將過期的段文件刪除。
如果每個消息都要在index
中保存位置信息,index
文件自身大小也很容易變的很大。所以Kafka將index
設計為稀疏索引來減小index
文件的大小。
消息冗余數量。不能超過集群中Broker的數量。
# 創建Topic # --topic 主題名稱 避免使用[_]及[.]號 # --replication-factor 副本數量(不能超過broker節點數) # --partitions 分區數量(并發) ./bin/kafka-topics.sh --create \ --topic UserDataQueue \ --replication-factor 3 \ --partitions 5 \ --bootstrap-server localhost:9092,localhost:9093,localhost:9094 # 查看Topic ./bin/kafka-topics.sh --list \ --bootstrap-server localhost:9092,localhost:9093,localhost:9094 # 修改Topic # 刪除Topic
# 發送消息 # --topic 指定目標Topic ./bin/kafka-console-producer.sh \ --topic UserDataQueue \ --bootstrap-server localhost:9092,localhost:9093,localhost:9094 # 拉取消息 # --from-beginning 從頭開始(獲取現有的全量數據) ./bin/kafka-console-consumer.sh \ --topic UserDataQueue \ --bootstrap-server localhost:9092,localhost:9093,localhost:9094 \ --from-beginning
Kafka集群依賴于Zookeeper。
# 需要修改的參數 # the directory where the snapshot is stored. dataDir=/kafka/zkdata # the port at which the clients will connect clientPort=2182
# 啟動 ./bin/zookeeper-server-start.sh -daemon /kafka/zookeeper.properties
# 需修改參數 # The id of the broker. This must be set to a unique integer for each broker. broker.id=1 # 同一集群內ID必須唯一 # The address the socket server listens on. It will get the value returned from # java.net.InetAddress.getCanonicalHostName() if not configured. # FORMAT: # listeners = listener_name://host_name:port # EXAMPLE: # listeners = PLAINTEXT://your.host.name:9092 listeners=PLAINTEXT://localhost:9092 # 同一主機的話,端口號不能相同 # A comma separated list of directories under which to store log files log.dirs=/kafka/data01 # 日志存儲目錄,需做隔離 # Zookeeper connection string (see zookeeper docs for details). # This is a comma separated host:port pairs, each corresponding to a zk # server. e.g. "127.0.0.1:3000,127.0.0.1:3001,127.0.0.1:3002". # You can also append an optional chroot string to the urls to specify the # root directory for all kafka znodes. zookeeper.connect=localhost:2182 # Zookeeper連接地址,參見2.1 zk配置
# Kafka啟動 # broker-1 ./bin/kafka-server-start.sh -daemon /kafka/server01.properties # broker-2 ./bin/kafka-server-start.sh -daemon /kafka/server02.properties # broker-3 ./bin/kafka-server-start.sh -daemon /kafka/server03.properties
PrettyZoo 是一個基于 Apache Curator 和 JavaFX 實現的 Zookeeper 圖形化管理客戶端。
由下圖可以看到,集群3個Broker均正常啟動。
管理Topic,Topic消息,消費組等的Kafka可視化系統,相關文檔:https://akhq.io/
一個簡單且高效的監控系統。相關文檔:http://www.kafka-eagle.org/index.html
Kafka Eagle 自帶監控大屏。
Spring Boot版本:2.4.4。
官方示例:https://github.com/spring-projects/spring-kafka/tree/main/samples
implementation 'org.springframework.kafka:spring-kafka'
spring: kafka: bootstrap-servers: localhost:9092,localhost:9093,localhost:9094 producer: client-id: kfk-demo retries: 3
@RestController public class IndexController { @Autowired KafkaTemplate<Object, Object> kafkaTemplate; @GetMapping public String index() { int rdm = new Random().nextInt(1000); kafkaTemplate.send("UserDataQueue", new UserData("", rdm)); return "hello world"; } @GetMapping("index2") public String index2() { // 發送字符串方式 kafkaTemplate.send("UserDataTopic", new Gson().toJson(new UserData("apple", 23))); return "ok"; } }
@Component @KafkaListener( id = "kfk-demo-userdata", topics = {"UserDataQueue"}, groupId = "kfk-demo-group", clientIdPrefix = "kfk-demo-client") public class KfkListener { @KafkaHandler public void process(@Payload UserData ud, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic, @Header(KafkaHeaders.RECEIVED_PARTITION_ID) int partition) { System.out.println(String.format("topic: %s, partition: %d, userData: %s", topic, partition, ud)); } @KafkaHandler(isDefault = true) public void process(Object obj) { System.out.println(obj); } } // 接收字符串方式 @Slf4j @Component @KafkaListener(id = "kfk-demo2", topics = {"UserDataTopic"}) public class KfkUserDataTopicListener { @KafkaHandler public void process(String userDataStr) { UserData userData = new Gson().fromJson(userDataStr, UserData.class); log.info("username: {}, age: {}", userData.getUsername(), userData.getAge()); } }
@Configuration public class KafkaConfig { @Bean public NewTopic userDataTopic() { return new NewTopic("UserDataTopic", 3, (short) 1); } }
“如何使用消息隊列”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注創新互聯網站,小編將為大家輸出更多高質量的實用文章!
本文標題:如何使用消息隊列
當前路徑:http://m.newbst.com/article34/gseise.html
成都網站建設公司_創新互聯,為您提供企業建站、云服務器、建站公司、網站設計、標簽優化、定制開發
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯