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

Kafka 的实现原理

  •  2
     
  •   lml12377 · 2017-05-03 11:17:59 +08:00 · 3941 次点击
    这是一个创建于 2521 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在用 kafka 实在有点懵逼

    之前用的是 https://github.com/weiboad/kafka-php 一直用的 0.1.x 版本,今天发现升级到了 0.2.x 版本,之前一直作为 producer 推送没有任何问题,但是 comsumer 消费一直提示 timeout,errcode -7。

    一直不太明白 kafka 的实现原理,时间也不允许慢慢抠,有没有大哥帮忙稍微讲解一下~

    • kafka 和 zookeeper 之间是什么关系?
    • kafka 是不是作为一个服务端 server 在运行,我 php 端连接上,不管是作为 producer 还是 comsumer,都是作为客户端?
    • 之前看了一下上面 producer 的源码,在 constrcut 不使用 zk 的情况下,好像只是 socket 连接,那我 php 环境在往 kafka server 连接的时候,本地的 php 环境需不需要装什么扩展?比如 librdkafka 这个是做什么用的?我试了作为生产者的时候没有装任何 zk/kafka 扩展也是完全可以推的
    第 1 条附言  ·  2017-05-09 15:30:22 +08:00
    最后还是用的 0.1.x 版本,不过没有安装任何扩展,直接把 Consumer 的 __construct 中的:

    $zookeeper = new \Kafka\ZooKeeper($hostList, $timeout);

    改为了

    $zookeeper = new \Kafka\MetaDataFromKafka($hostList);

    这样就不依赖 kafka 扩展(仿照的 Producer 中 __construct 提供第三个参数时的情况)。

    不过这个 Consumer 并不是真正意义上的被推送(公司上个版本的 kafka server 带 loginOn/loginOff 手动上下线功能的确实是 http 请求主动推送给我的),而是我的脚本主动请求的 kafka server (死循环脚本 -n1 一个 master 一个 worker 在跑)。

    另外 Producer 遇到一个坑:当 Producer 超过 10 分钟没有推送任何消息时,kafka server 会主动断开 socket 连接,这个时候再调用 send() 就会抛出异常,我选择的是在定时脚本 Task 的 execute() 中捕获异常(这个 execute() 是 Task 死循环执行业务逻辑的地方),重新创建 Producer 对象替换原先挂在 Task 对象上的 Producer 对象(应该也可以在 Socket 对象内部 close 后重新 connect,不过没有仔细抠代码)。
    7 条回复    2017-05-03 22:54:39 +08:00
    lovedebug
        1
    lovedebug  
       2017-05-03 11:33:09 +08:00   ❤️ 1
    kafka 的官方文档十分的详细,已经到发指了。另外不想看英文的网上有很多中文版的文档啊。
    kafka 可以视作中间件,消息队列,客户端,服务端,完全看你怎么用。
    zookeeper 用于分布式管理的。
    lml12377
        2
    lml12377  
    OP
       2017-05-03 11:43:37 +08:00
    @lovedebug 上面那个 git,0.1.x 版本消费者是强制装 zookeeper.so 扩展的,这个扩展是什么目的啊? zk 不是用来给 kafka server 做负载的吗?为啥我客户端还要装这个扩展啊? kafka 不是基于 tcp 连接的吗,那我 socket 能连上去原则上就能用了啊
    billlee
        3
    billlee  
       2017-05-03 12:40:25 +08:00   ❤️ 1
    kafka 的 comsumer 比较复杂,有 group/partition 等概念,如果挂了需要重新分发消息什么的,需要要维护状态,依赖 zookeeper.
    Producer 就简单多了,挂了就挂吧,又不影响其他组件。
    k9982874
        4
    k9982874  
       2017-05-03 13:13:05 +08:00   ❤️ 1
    印象中 zookeeper 好像是用来在 leader 挂掉以后选举新 leader 时用
    sampeng
        5
    sampeng  
       2017-05-03 13:17:20 +08:00   ❤️ 2
    1.zk 不用理解太复杂,理解成一个云里的配置文件就好。这个配置文件发生任何变化,所有观察者都马上能知道。其他的什么分配原理,如果有时间再去深入即可。
    2.答案是是。但是和 zk 配合后就不是传统 cs 的概念,是一个无中心系统。任何一个节点都能提供服务。至于怎么发现的,通过 zk。php 连上的后的角色是看你做什么,不是简单的概念,你要拉,你就是 comsumer。你要推,就是 producer。
    3.librdkakfa 应该是 native 写的扩展。php 没有扩展就不能做 socket 操作了?只是没长连接而已。。。。
    lovedebug
        6
    lovedebug  
       2017-05-03 14:25:38 +08:00   ❤️ 1
    @lml12377 zk 的配置很复杂,建议看 kafka 的文档,里面有推荐配置还有解释,比我说的要权威多了。
    Fishdrowned
        7
    Fishdrowned  
       2017-05-03 22:54:39 +08:00 via Android   ❤️ 1
    kafka consumer 0.8 和 0.9 不兼容。如果你服务端是 0.8 那只能用 weiboad/kafka-php 0.1.x。

    librdkafka 0.3 以上才支付 php7。

    版本兼容,这个到处都充满恶意的世界
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1013 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:40 · PVG 03:40 · LAX 12:40 · JFK 15:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.