惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tor Project blog
博客园 - 聂微东
Microsoft Azure Blog
Microsoft Azure Blog
博客园 - 【当耐特】
G
Google Developers Blog
J
Java Code Geeks
The Cloudflare Blog
Attack and Defense Labs
Attack and Defense Labs
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
Cisco Talos Blog
Cisco Talos Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
I
Intezer
Jina AI
Jina AI
T
Tenable Blog
P
Palo Alto Networks Blog
Project Zero
Project Zero
D
DataBreaches.Net
Hugging Face - Blog
Hugging Face - Blog
The Hacker News
The Hacker News
F
Full Disclosure
Cloudbric
Cloudbric
量子位
H
Heimdal Security Blog
K
Kaspersky official blog
有赞技术团队
有赞技术团队
罗磊的独立博客
V
Vulnerabilities – Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
Recent Announcements
Recent Announcements
WordPress大学
WordPress大学
GbyAI
GbyAI
S
SegmentFault 最新的问题
M
MIT News - Artificial intelligence
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
Recorded Future
Recorded Future
Security Archives - TechRepublic
Security Archives - TechRepublic
AI
AI
Webroot Blog
Webroot Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
T
The Exploit Database - CXSecurity.com
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
H
Hacker News: Front Page
Latest news
Latest news

Kafka

请问一下,多节点消费 kafka 如何做到串行消费 Kafka 消息处理冲突问题 - V2EX kafka king 陆续也快有 100 个 star 了,虽然很少,但是也是对我的认可,感谢大家 - V2EX 求助一个 zookeeper 配置 acl, kafka 是否需要做相关修改的问题 - V2EX 2023 年基于 Kafka 做重试队列的最佳实践? - V2EX kakfa 生产者的 ack=all 的参数会受到 broker 的最小同步副本参数的影响吗 - V2EX kafka 的 producer 和 broker 的关系是什么? - V2EX kafka 性能问题: kafka 传递海量小数据的时候,需要合并数据发送吗 - V2EX 有无 kafka 八股文或者书籍推荐 - V2EX 有什么好用的 kafka 桌面客户端? - V2EX kafka Kraft 模式增加投票节点配置后启动报错 - V2EX kafka-console-consumer.sh 同时读取某个 topic 的所有 partition 能实现吗? - V2EX 请教一个使用 HAProxy 代理访问 kafka 集群的问题 - V2EX kafka stream 拓扑的几个疑问 在生产环境中,向 kafka 发送图片消息是否合适 - V2EX kafka 消费者平滑退出一般是怎么做的? 请教 kafka 独立消费者 如果崩溃了如何获取 offset? - V2EX 关于 kafka 丢数据 - V2EX 如何获取 KRaft Kafka 的 controller leader - V2EX 如何从 Kafka 消费的数据中取最大值存储? - V2EX Kafka Stream 拓扑结构可视化 - V2EX Kafka 数据同步 - V2EX 请教一下 kafka group 数量比较大对 kafka 性能影响大吗 - V2EX 为什么很多场景数据先写入 kafka 再写入 elastic,而不是直接写 elastic? - V2EX Golang Kafka Writer 消息被截断 - V2EX kakfa producer 发消息会堵塞么? kakfa 的 producer 阻塞该怎么查 - V2EX 请问一下实际业务中, kafka 的消费者组一般应用于什么场景? - V2EX kafka 多线程消费是否必须手动提交 offset/partion 才能避免竞争 - V2EX 求一个基于 kafka 的消息消费框架 - V2EX kafka 如何实现每 10 秒拉一次数据? - V2EX 蹲一个 Kafka 大神,新增 partition 没有引起消费组的 rebalance,偶现 - V2EX kafka 如何知道生产者的 IP? - V2EX Python 消费 ka-f-a-k 时无限挂起,如何定位原因 - V2EX Python 消费 kafka 时无限挂起,如何定位原因 - V2EX xshell 无法使用 kafka 命令行发送消息到 topic - V2EX [Kafka] 求助, 同一个服务如何组播消费 kafka 某个 topic 的消息呢? - V2EX kafka 非常非常非常难用 - V2EX 有什么办法可以让 kafka 消费者走代理么? - V2EX 如何在消息消费者多实例(Cluster)的情况下保证应用级别的精确分发? - V2EX 各位大佬, zookeeper 加了 digest , kafka 要怎么改配置啊? - V2EX Kafka 需不需要设置安全认证 - V2EX springboot 集成 kafka 广播式消费 - V2EX kafka 疑惑,为什么随着 topic 增加,性能会急剧下降 - V2EX 求 kafka 的 docker 镜像? - V2EX 有老哥知道怎么给 kafka 某个 topic 创建消费组 - V2EX 准备写个基于 kafka 的延迟队列, 有感兴趣的吗 - V2EX 问一个消息队列的问题 - V2EX 有同学在生产环境里用过 Apache Kafka 么?能否分享一下你踩过的坑? - V2EX Kafka 内存陡然降低问题 - V2EX
关于 PHP Rdkafka 消费者性能讨论 - V2EX
yuandj · 2021-05-11 · via Kafka

当下遇到的问题:

服务提供商:
1. 集群每个节点的吞吐量在 1.5 MB/s 左右,远小于服务的吞吐量
2. 3 个节点每个 topic 设置 90 个分区, 3 副本,这个使用方式不太合理,服务需要对每个 topic 维护 90x3 个 replica 进程,io process 也要维护 90x3 个,原来顺序的读写也会退化为随机读写,网络 process 需要维护 90 个
3. 看历史监控记录,副本延迟在过去是会频繁发生的
4. 之前有建议您修改分区到 6 ~ 9 个 您这边反馈分区数调低之后消费者有延迟,实际您这边的吞吐量远没有达到服务应该有的吞吐量,怀疑是客户端方面有问题,需要您在消费端打印每次 poll 的时间和 poll 下来的消息条数,确定消费者行为,这样我们可以进一步分析

现在我们这边的解决方案还是和之前的建议一样,topic 分区数调整到 6 ~ 9 个,消费延迟的问题需要从客户端出发解决

开发者:
调整为 6 个分区之后,不是消费延迟问题,是单个消费者的能力不足,跟不上生产的速度。之前已经试过了,10 来分钟就堆积了 100 万消息。

服务提供商:
6 个分区的话,可以使用 6 个消费者,6 个消费者的能力远不止这么差.
max.poll.records,可以用于指定批量消费条数的
配合配置 max.partition.fetch.byte 和 fetch.max.wait.ms 两个参数 可以实现批量消费 kafka 的消息。您看看 php 的客户端是否有设置这些参数的地方,或者有其他地方可以设置消费者的批量消费的,因为一条条的消费,效率是极低的

开发者:
rdkafka 扩展里,好像没这个相关的参数

当前是 1 个 topic,90 个分区,分区数太多引起 kafka 集群副本同步时的性能下降问题。服务商建议减少分区数,但是减少分区数会有大量的消息堆积,rdkafka 如何提升单消费者的性能呢?

消费者大致代码如下:

$this->RdKafkaConf = new RdKafka\Conf();

$this->RdKafkaConf->setRebalanceCb(function (RdKafka\KafkaConsumer $kafka, $err, array $partitions = null) {
            switch ($err) {
                case RD_KAFKA_RESP_ERR__ASSIGN_PARTITIONS:
                    $kafka->assign($partitions);
                    break;
                case RD_KAFKA_RESP_ERR__REVOKE_PARTITIONS:
                    $kafka->assign(null);
                    break;
                default:
                    throw new \Exception($err);
            }
        });

        $this->RdKafkaConf->set('group.id', $groupid);
        // Initial list of Kafka brokers
        $this->RdKafkaConf->set('metadata.broker.list', $configs);
        $this->RdKafkaConf->set('socket.keepalive.enable', 'true');
        $this->RdKafkaConf->set('enable.auto.commit', 'true');
        $this->RdKafkaConf->set('auto.commit.interval.ms', '100');
        $this->RdKafkaConf->set('auto.offset.reset', 'smallest');

        $topic = is_array($topic) ? $topic : [$topic];
        $consumer = new RdKafka\KafkaConsumer($this->RdKafkaConf);
        $consumer->subscribe($topic);
        while (true) {
            $message = $consumer->consume($timeout * 1000);
            switch ($message->err) {
                case RD_KAFKA_RESP_ERR_NO_ERROR:
                    call_user_func_array($callback, [$message]);
//                    $consumer->commitAsync($message);
                    break;
                case RD_KAFKA_RESP_ERR__PARTITION_EOF:
//                    Log::get('consumer')->info("No more messages; will wait for more");
                    break;
                case RD_KAFKA_RESP_ERR__TIMED_OUT:
//                    Log::get('consumer')->error("Timed out");
                    break;
                default:
                    throw new \Exception($message->errstr(), $message->err);
            }
        }


//callback function
if (count(self::$queue) >= 10 || (time() - $this->lastWriteTimestamp) >= 1) {
                self::$queue[] = $msg;
                $queue = self::$queue;
                self::$queue = [];
                $this->lastWriteTimestamp = time();
                $reportData = [];
                
                foreach ($queue as $message) {
                    $data = json_decode($message->payload, true);
                    // 入库
                }
} else {
                self::$queue[] = $msg;
}