V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ligudo
V2EX  ›  程序员

求教 kafka 的一个问题 : )

  •  
  •   ligudo · 2019-07-30 10:27:36 +08:00 · 3147 次点击
    这是一个创建于 1942 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    求教诸位 V2er :)

    18 条回复    2019-07-30 23:33:24 +08:00
    hunterzhang86
        1
    hunterzhang86  
       2019-07-30 11:39:50 +08:00   ❤️ 1
    什么错都没报吗?理论上这种网络的问题可能性比较大。
    ligudo
        2
    ligudo  
    OP
       2019-07-30 11:57:03 +08:00
    @hunterzhang86 嗯,没有报错信息。郁闷,猜想也是网络问题,还没定位到原因
    dooonabe
        3
    dooonabe  
       2019-07-30 12:06:02 +08:00 via Android   ❤️ 1
    能贴个架构图吗
    fireapp
        4
    fireapp  
       2019-07-30 12:16:56 +08:00 via iPhone   ❤️ 1
    大概是配置问题,你看看 advertised.listeners,配置的啥,这个是给客户端用的,不一致的话服务端不接受消息,只有空 topic
    hunterzhang86
        5
    hunterzhang86  
       2019-07-30 12:17:13 +08:00   ❤️ 1
    @ligudo 试试 telnet broker 对应的端口看通不通,还有发送的测试最好不要写 UT 的方式去发送,直接 main 方法启动 Java 进程发送比较好。
    sirgod
        6
    sirgod  
       2019-07-30 13:06:25 +08:00   ❤️ 1
    说个题外话,看起来你们是让客户端直接连 kafka 了吗?这样不好吧?
    ligudo
        7
    ligudo  
    OP
       2019-07-30 13:54:13 +08:00
    @sirgod 木有,哪能这么干我的伙计
    ligudo
        8
    ligudo  
    OP
       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
        9
    LeeSeoung  
       2019-07-30 15:05:52 +08:00   ❤️ 1
    注册到同个 group 的消费者,在你 topic 只有一个分区的情况下只有一个消费者能够消费,你这个问题就是这种情况,可以在输出日志那里看到消费者有没注册成功,也可以在服务端输出消费者信息查看。。
    purensong
        10
    purensong  
       2019-07-30 15:10:14 +08:00   ❤️ 1
    一个 topic 不是只能给一个 consumer group 中的一个 consumer 消费吗
    LeeSeoung
        11
    LeeSeoung  
       2019-07-30 15:13:52 +08:00
    @purensong topic 有多分区的话是可以安排给同 group 中的不同 consumer 的。
    xaoduer
        12
    xaoduer  
       2019-07-30 16:07:36 +08:00   ❤️ 1
    lz 应该是客户端和服务端都在订阅同一个 topic,但是该 topic 只有一个分区,于是就这样了。问题详解我看 lz 上面贴的比较清楚了
    ligudo
        13
    ligudo  
    OP
       2019-07-30 16:17:56 +08:00
    @xaoduer 嗯,以为 kafka 也类似传统发布 /订阅模型,所以一开始觉得是网络原因,花了老哥半天时间
    laminux29
        14
    laminux29  
       2019-07-30 16:23:50 +08:00
    题主应该是把 kafka 当成带重试与恢复的高级 rpc 用了,然后又没去 catch kafka 代码里每一处 exception,出了问题自然就不知道了。
    1oNflow
        15
    1oNflow  
       2019-07-30 17:36:05 +08:00 via iPhone
    @sirgod 客户端不能直接连 kafka 吗?那客户端怎么接收消息啊
    sirgod
        16
    sirgod  
       2019-07-30 21:16:44 +08:00
    @1oNflow kafka 是后端组件,开放给客户端连接很不安全,客户端接受消息可以从客户端主动连接服务端建立长链接,或者利用长轮询机制
    1oNflow
        17
    1oNflow  
       2019-07-30 23:20:32 +08:00
    @sirgod 感谢回复,也就是在客户端和 kafka 之间加一个服务器,客户端开 websocket 到服务器,服务器再连到 kafka 吧。
    sirgod
        18
    sirgod  
       2019-07-30 23:33:24 +08:00
    @1oNflow 是的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2090 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:37 · PVG 08:37 · LAX 16:37 · JFK 19:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.