公司需要分布式的JMS,所以研究了Kafka,之前在本地都沒有出現問題,但是在服務器上布Kafka的時候發現了消費者無法消費的問題。
kafka布到一台服務器上面,由於業務原因,producer和kafka放到一台服務器上面,所以producer發送消息的時候bootrstrap.servers只要配置localhost:port就可以了,但是consumer是在另一台服務器上面,修改了bootstrap.servers為kafka服務器的ip和端口發現還是無法消費。
出現問題1:kakfa的consumer不報錯,但是無法消費。
解決問題1:在broker配置中加入如下配置
advertised.host.name=xxx.xx.xx.xx
advertised.listeners=PLAINTEXT://xxx.xx.xx.xx:port
配置完了之后發現還是無法消費。
出現問題2:no route to host
解決問題2:管理kakfa的zookeeper端口號未暴露在外網,將zookeeper的端口設置成外網可以訪問。(具體方法百度,樓主也是百度的,linux不太熟練)
配置完了之后發現還是無法消費,我去了。
出現問題3:no route to host
解決問題3:發現了kafka的端口也需要暴露給consumer,我疏忽了,和問題2同樣的方法暴露端口。
配置完了之后發現還是無法消費,我已經崩潰了。
出現問題4:MDGG,沒有報錯,什么錯都沒有。
解決問題4:哈哈哈,樓主將consumer配置中的group.id換了一個就可以啦。
終於可以消費了......
總結:
1.注意服務器的對外訪問的端口是不是可用。
2.修改broker配置加入advertised等配置信息。
3.記得修改一下consumer消費者組,如果修改組不行,那么先刪除zookeeper的kafka消息記錄,然后再還consumer組試試。
樓主分析修改消費者組就能消費的原因可能是,未修改之前,zookeeper默認還是記得這個消費者組消費的是之前的kafka里面的數據,但是之前的kakfa是本地,所以這個消費者組沒有被糾正或者告知你要訪問新的kafka服務器,所以在修改為新的消費者組的時候,zookeeper重新記錄的消費者的信息,就可以消費新服務器的消息了。
