求教 kafka 的一个问题 : )

2019-07-30 10:27:36 +08:00
 ligudo

使用 kafka 实现 websocket 扫码登录,现在测试遇到个问题: kafka 部署在服务器上,使用外置 zookeeper, 服务器和本地分别启动应用, 本地应用可以监听到服务器发送的消息, 服务器获取不到本地发送的 topic 消息。

求教诸位 V2er :)

3147 次点击
所在节点    程序员
18 条回复
hunterzhang86
2019-07-30 11:39:50 +08:00
什么错都没报吗?理论上这种网络的问题可能性比较大。
ligudo
2019-07-30 11:57:03 +08:00
@hunterzhang86 嗯,没有报错信息。郁闷,猜想也是网络问题,还没定位到原因
dooonabe
2019-07-30 12:06:02 +08:00
能贴个架构图吗
fireapp
2019-07-30 12:16:56 +08:00
大概是配置问题,你看看 advertised.listeners,配置的啥,这个是给客户端用的,不一致的话服务端不接受消息,只有空 topic
hunterzhang86
2019-07-30 12:17:13 +08:00
@ligudo 试试 telnet broker 对应的端口看通不通,还有发送的测试最好不要写 UT 的方式去发送,直接 main 方法启动 Java 进程发送比较好。
sirgod
2019-07-30 13:06:25 +08:00
说个题外话,看起来你们是让客户端直接连 kafka 了吗?这样不好吧?
ligudo
2019-07-30 13:54:13 +08:00
@sirgod 木有,哪能这么干我的伙计
ligudo
2019-07-30 14:07:33 +08:00
通常来讲,消息模型可以分为两种, 队列和发布-订阅式。 队列的处理方式是 一组消费者从服务器读取消息,一条消息只有其中的一个消费者来处理。在发布-订阅模型中,消息被广播给所有的消费者,接收到消息的消费者都可以处理此消息。Kafka 为这两种模型提供了单一的消费者抽象模型: 消费者组 ( consumer group )。 消费者用一个消费者组名标记自己。 一个发布在 Topic 上消息被分发给此消费者组中的一个消费者。 假如所有的消费者都在一个组中,那么这就变成了 queue 模型。 假如所有的消费者都在不同的组中,那么就完全变成了发布-订阅模型。 更通用的, 我们可以创建一些消费者组作为逻辑上的订阅者。每个组包含数目不等的消费者, 一个组内多个消费者可以用来扩展性能和容错。

作者:半兽人
链接: https://www.orchome.com/5
来源:OrcHome
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

找到原因了伙计们,即以上所述,基础鸭。
更改前配置:
spring:
kafka:
consumer:
group-id: websocket
更改后配置:
spring:
kafka:
consumer:
group-id: ${spring.cloud.client.hostname}:${server.port}:websocket
LeeSeoung
2019-07-30 15:05:52 +08:00
注册到同个 group 的消费者,在你 topic 只有一个分区的情况下只有一个消费者能够消费,你这个问题就是这种情况,可以在输出日志那里看到消费者有没注册成功,也可以在服务端输出消费者信息查看。。
purensong
2019-07-30 15:10:14 +08:00
一个 topic 不是只能给一个 consumer group 中的一个 consumer 消费吗
LeeSeoung
2019-07-30 15:13:52 +08:00
@purensong topic 有多分区的话是可以安排给同 group 中的不同 consumer 的。
xaoduer
2019-07-30 16:07:36 +08:00
lz 应该是客户端和服务端都在订阅同一个 topic,但是该 topic 只有一个分区,于是就这样了。问题详解我看 lz 上面贴的比较清楚了
ligudo
2019-07-30 16:17:56 +08:00
@xaoduer 嗯,以为 kafka 也类似传统发布 /订阅模型,所以一开始觉得是网络原因,花了老哥半天时间
laminux29
2019-07-30 16:23:50 +08:00
题主应该是把 kafka 当成带重试与恢复的高级 rpc 用了,然后又没去 catch kafka 代码里每一处 exception,出了问题自然就不知道了。
1oNflow
2019-07-30 17:36:05 +08:00
@sirgod 客户端不能直接连 kafka 吗?那客户端怎么接收消息啊
sirgod
2019-07-30 21:16:44 +08:00
@1oNflow kafka 是后端组件,开放给客户端连接很不安全,客户端接受消息可以从客户端主动连接服务端建立长链接,或者利用长轮询机制
1oNflow
2019-07-30 23:20:32 +08:00
@sirgod 感谢回复,也就是在客户端和 kafka 之间加一个服务器,客户端开 websocket 到服务器,服务器再连到 kafka 吧。
sirgod
2019-07-30 23:33:24 +08:00
@1oNflow 是的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/587391

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX