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

Kafka 的实现原理

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

    最近在用 kafka 实在有点懵逼

    之前用的是 https://github.com/weiboad/kafka-php 一直用的 0.1.x 版本,今天发现升级到了 0.2.x 版本,之前一直作为 producer 推送没有任何问题,但是 comsumer 消费一直提示 timeout,rrcode -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     Solana     1327 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 17:03 PVG 01:03 LAX 09:03 JFK 12:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86