rd_kafka_q_serve 可以说是Librdkafka库的灵魂,所以有必要单独撕一下源码。
1 这是一个阻塞方法。即获取op和callback是串行完成的。
2 所以该方法的参数包含要每次处理的最大数量。
主要逻辑代码:
rd_kafka_q_serve
-->如果有fwd_q(使用rd_kafka_q_fwd_get获取), 那么处理fwd_q的消息并返回。即优先处理fwd_q.
-->否则判断是否有op,如果没有,等待直到timeout.
-->如果有op,那么将max_cnt个op移动到本地队列localq.并释放锁。类似的移动到本地队列的操在库中多次出现。
--> rd_kafka_q_deq0弹出op,
-->rd_kafka_op_handle处理。
--->rd_kafka_op_handle_std标准op处理。这个函数写的挺乱的。多个if elseif , 不容易看出MECE。但是主要逻辑是无需处理的尽快返回。
---->如果是RD_KAFKA_OP_CB 类型,则调用rd_kafka_op_call 进行callback
如果是RD_KAFKA_OP_RECV_BUF类型,则调用rd_kafka_buf_handle_op。
----->使用rko->rko_op_cb方法
--->callback特殊约定的callback
使用场景:
rk_kafka_thread_main
rd_kafka_poll
rd_kafka_queue_poll_callback
rd_kafka_q_pop_serve:
相比rd_kafka_q_serve,仅仅增加了等待timeout功能。