LVGL - RV1109 LVGL UI刷新效率优化-02
说明
前面好早写过一个文章,说明如何把LVGL移到RV1109上的操作,使用DRM方式!但出现刷新效率不高的问题!
因为一直没有真正的应用在产品中,所以也就放下了!
最近开发上需要考虑低成本,低内存的方案,所以后续考虑使用LVGL上来做UI,所以这里捡回来再炒一次!
性能分析
这里还是使用的LV_DEMO中的lv_demo_benchmark来测试的!
代码见前一相关的文:LVGL - RV1109 LVGL UI开发-01
先找到了为什么刷新FPS如此低的原因,主要耗时花在了:
lvgl_drm_flush->display_commit_ex->drm_commit_ex->drmCommit
上面!
这样导致UI的线程绘图也很慢!
解决方式
最开始想使用双缓存的方式来提交,但看代码drmCommit是整屏修改提交的!不过对drm里的这个commit底层操作还是不太了解!
还是把耗时的这个操作分开操作!使用另一个线程来commit,这样只要在另一个线程中,如是UI线程有调用lvgl_drm_flush 这个后,发送一个消息通知刷新线程drm commit操即可!
代码修改很简单,在 drm_commit_ex 中使用一个mutex和cond来通知另一个线程:
#ifdef DRM_COMMIT_THREADprintf("commit request!!!!!!!!!!!\n");pthread_mutex_lock(&g_commit_mutex);pthread_cond_broadcast(&g_commit_cond);pthread_mutex_unlock(&g_commit_mutex);
#elseret = drmCommit(&disp->buf[num], disp->width, disp->height, 0, 0, &disp->dev, disp->plane_type);if (ret) {fprintf(stderr, "display commit error, ret = %d\n", ret);}
#endif
这里用了一个宏 DRM_COMMIT_THREAD 来控制!
在另一个线程中主要处理如下,即把drmCommit动作放在这里来操作:
#ifdef DRM_COMMIT_THREAD
void* dsiplay_commit_thread_process(void* data)
{int ret = 0;while(g_commit_thread_start_flag){pthread_mutex_lock(&g_commit_mutex);pthread_cond_wait(&g_commit_cond, &g_commit_mutex);pthread_mutex_unlock(&g_commit_mutex);//printf("dsiplay_commit_thread_process!!!!!!............\n");ret = drmCommit(&g_disp.buf[g_num], g_disp.width, g_disp.height, 0, 0, &g_disp.dev, g_disp.plane_type);if (ret) {fprintf(stderr, "display commit error, ret = %d\n", ret);}usleep(1000 * 40);}
}int display_commit_thread_start()
{int ret = 0;pthread_t pid = 0;pthread_attr_t attr;ret = pthread_attr_init(&attr);if(ret != 0){printf("start pthread_attr_init failure!!!\n");return -1;}ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);if(ret != 0){pthread_attr_destroy(&attr);printf( "pthread_attr_setdetachstate PTHREAD_CREATE_DETACHED failure!!!\n");return -1;}ret = pthread_create(&pid, &attr, dsiplay_commit_thread_process, NULL);if(ret == 0){printf(" pthread_create OK! \n");}else{printf(" pthread_create failure!! \n");pthread_attr_destroy(&attr);return -1;}pthread_attr_destroy(&attr);return 0;
}
#endif
性能表现
下面是 lv_demo_widgets 的统计数据:
lv_demo_widgets示例数据
FPS统计方式:
FPS统计方式,这里统计drmCommit花费的时间,看一定时长里能提交多少次:
ts = _clockTime_getCurrentMscTime();ret = drmCommit(&g_disp.buf[g_num], g_disp.width, g_disp.height, 0, 0, &g_disp.dev, g_disp.plane_type);if (ret) {fprintf(stderr, "display commit error, ret = %d\n", ret);}commit_count++;//usleep(1000 * 40);commit_count_cost_time += _clockTime_checkLostMscTime(ts);if(commit_count >= 64 || commit_count_cost_time > 1000 * 30){int fps = commit_count / (commit_count_cost_time / 1000.0);printf("FPS:%d\n", fps);commit_count = 0;commit_count_cost_time = 0; }}
FPS打印统计:
FPS:81
FPS:86
FPS:77
FPS:80
FPS:79
FPS:83
FPS:76
FPS:77
FPS:93
FPS:82
FPS:83
FPS:72
FPS:82
FPS:80
FPS:80
CPU占用
top - 15:57:46 up 6:57, 2 users, load average: 1.40, 0.84, 0.85
Tasks: 106 total, 3 running, 46 sleeping, 1 stopped, 0 zombie
%Cpu0 : 3.0/21.8 25[||||||||||||||||||||||||| ]
%Cpu1 : 25.7/23.8 50[|||||||||||||||||||||||||||||||||||||||||||||||||| ]
GiB Mem : 7.9/0.876 [ ]
GiB Swap: 0.0/0.000 [ ]PID USER PR NI VIRT RES %CPU %MEM TIME+ S COMMAND 1 root 20 0 2.0m 0.2m 0.0 0.0 0:00.51 S init 102 root 20 0 2.0m 0.2m 0.0 0.0 0:00.05 S `- syslogd 105 root 20 0 2.0m 0.2m 0.0 0.0 0:00.04 S `- klogd
lv_demo_benchmark统计数据:
FPS打印统计
Result of FPS:47
FPS:80
Result of FPS:40
FPS:78
Result of FPS:46
FPS:74
Result of FPS:40
FPS:74
Result of FPS:42
FPS:83
Result of FPS:28
FPS:79
Result of FPS:50
Result of FPS:51
FPS:77
Result of FPS:48
FPS:77
Result of FPS:47
FPS:73
Result of FPS:42
FPS:75
Result of FPS:41
FPS:79
Result of FPS:49
FPS:75
Result of FPS:51
FPS:77
Result of FPS:50
FPS:78
Result of FPS:50
Result of FPS:50
FPS:80
Result of FPS:48
FPS:76
CPU占用
top - 16:03:47 up 7:03, 2 users, load average: 2.10, 1.93, 1.38
Tasks: 107 total, 2 running, 45 sleeping, 1 stopped, 0 zombie
%Cpu0 : 1.0/11.8 13[||||||||||||| ]
%Cpu1 : 68.6/16.7 85[|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ]
GiB Mem : 7.8/0.876 [ ]
GiB Swap: 0.0/0.000 [ ]PID USER PR NI VIRT RES %CPU %MEM TIME+ S COMMAND 1 root 20 0 2.0m 0.2m 0.0 0.0 0:00.51 S init 102 root 20 0 2.0m 0.2m 0.0 0.0 0:00.05 S `- syslogd 105 root 20 0 2.0m 0.2m 0.0 0.0 0:00.04 S `- klogd 120 root 20 0 2.7m 1.9m 0.0 0.2 0:00.22 S `- udevd 573 root 20 0 1.9m 0.1m 0.0 0.0 0:00.00 S `- dropbear 1113 root 20 0 2.3m 1.6m 0.0 0.2 0:12.49 S `- dropbear 1114 root 20 0 2.0m 1.5m 0.0 0.2 0:00.01 S `- sh 1189 root 20 0 2.8m 1.6m 0.0 0.2 0:28.82 T `- top 1220 root 20 0 2.8m 1.6m 1.9 0.2 0:07.22 R `- top 628 root 20 0 1.4m 0.1m 0.0 0.0 0:00.00 S `- input-event-dae 851 root 20 0 2.0m 0.3m 0.0 0.0 0:00.02 S `- login 852 root 20 0 2.0m 1.6m 0.0 0.2 0:00.62 S `- sh 893 root 20 0 1.4m 0.2m 0.0 0.0 0:00.32 S `- wdt_deamon 1225 root 20 0 39.4m 14.7m 84.5 1.6 0:25.70 R `- pupa_face 2 root 20 0 0.0m 0.0m 0.0 0.0 0:00.03 S kthreadd 3 root 0 -20 0.0m 0.0m 0.0 0.0 0:00.00 I `- rcu_gp 4 root 0 -20 0.0m 0.0m 0.0 0.0 0:00.00 I `- rcu_par_gp 8 root 0 -20 0.0m 0.0m 0.0 0.0 0:00.00 I `- mm_percpu_wq 9 root 20 0 0.0m 0.0m 0.0 0.0 0:01.78 S `- ksoftirqd/0 10 root 20 0 0.0m 0.0m 0.0 0.0 1:17.11 I `- rcu_preempt 11 root 20 0 0.0m 0.0m 0.0 0.0 0:00.00 I `- rcu_sched 12 root 20 0 0.0m 0.0m 0.0 0.0 0:00.00 I `- rcu_bh 13 root rt 0 0.0m 0.0m 0.0 0.0 0:00.11 S `- migration/0 14 root 20 0 0.0m 0.0m 0.0 0.0 0:00.00 S `- cpuhp/0 15 root 20 0 0.0m 0.0m 0.0 0.0 0:00.00 S `- cpuhp/1 16 root rt 0 0.0m 0.0m 0.0 0.0 0:00.02 S `- migration/1
分开线程处理后,刷新率立即就上来了,UI线程的FPS在跑 lv_demo_benchmark时,平均commit可以跑到70FPS.
CPU占用率上,不过明显的上升了,使用单线程方式时,CPU占用率在只在5%上下,使用多线程方式时,CPU平均在15%左右,连续操作甚至50%以上!
所以还是还是需要控制一下FPS,这里在dsiplay_commit_thread_process加一个usleep操作.
在跑lv_demo_widgets这个示例时,第二个tab页的 Analytics 界面,能看到仪表盘的每一秒的跳动了,之前的代码是直接跳秒的。
加usleep控制一下刷新
FPS打印统计
FPS:24
Result of FPS:40
Result of FPS:37
Result of FPS:38
FPS:24
Result of FPS:33
Result of FPS:25
Result of FPS:25
FPS:24
Result of FPS:25
Result of FPS:23
Result of FPS:35
FPS:24
Result of FPS:26
Result of FPS:29
Result of FPS:25
Result of FPS:29
FPS:24
Result of FPS:24
Result of FPS:21
Result of FPS:16
FPS:24
CPU占用
top - 16:17:17 up 7:16, 2 users, load average: 1.08, 0.66, 0.86
Tasks: 106 total, 1 running, 46 sleeping, 1 stopped, 0 zombie
%Cpu(s): 21.3/19.3 41[|||||||||||||||||||||||||||||||||||||||| ]
GiB Mem : 7.8/0.876 [ ]
GiB Swap: 0.0/0.000 [ ]PID USER PR NI VIRT RES %CPU %MEM TIME+ S COMMAND 1 root 20 0 2.0m 0.2m 0.0 0.0 0:00.51 S init 102 root 20 0 2.0m 0.2m 0.0 0.0 0:00.05 S `- syslogd 105 root 20 0 2.0m 0.2m 0.0 0.0 0:00.04 S `- klogd 120 root 20 0 2.7m 1.9m 0.0 0.2 0:00.22 S `- udevd 573 root 20 0 1.9m 0.1m 0.0 0.0 0:00.00 S `- dropbear 1113 root 20 0 2.3m 1.6m 1.0 0.2 0:13.36 S `- dropbear 1114 root 20 0 2.0m 1.5m 0.0 0.2 0:00.01 S `- sh 1189 root 20 0 2.8m 1.6m 0.0 0.2 0:28.82 T `- top 1220 root 20 0 2.8m 1.6m 1.9 0.2 0:24.25 R `- top 628 root 20 0 1.4m 0.1m 0.0 0.0 0:00.00 S `- input-event-dae 851 root 20 0 2.0m 0.3m 0.0 0.0 0:00.02 S `- login 852 root 20 0 2.0m 1.6m 0.0 0.2 0:00.63 S `- sh 893 root 20 0 1.4m 0.2m 0.0 0.0 0:00.33 S `- wdt_deamon 1234 root 20 0 39.4m 14.5m 62.1 1.6 1:05.77 S `- pupa_face 2 root 20 0 0.0m 0.0m 0.0 0.0 0:00.04 S kthreadd 3 root 0 -20 0.0m 0.0m 0.0 0.0 0:00.00 I `- rcu_gp 4 root 0 -20 0.0m 0.0m 0.0 0.0 0:00.00 I `- rcu_par_gp 8 root 0 -20 0.0m 0.0m 0.0 0.0 0:00.00 I `- mm_percpu_wq 9 root 20 0 0.0m 0.0m 0.0 0.0 0:01.84 S `- ksoftirqd/0 10 root 20 0 0.0m 0.0m 1.0 0.0 1:19.85 I `- rcu_preempt 11 root 20 0 0.0m 0.0m 0.0 0.0 0:00.00 I `- rcu_sched
在使用单线程时,lv_demo_widgets在操作,如果是在刷新界面时,很明显有时是无法反应你的触摸操作的,改用多线程后,响应基本是很实时.
相关文章:
LVGL - RV1109 LVGL UI刷新效率优化-02
说明 前面好早写过一个文章,说明如何把LVGL移到RV1109上的操作,使用DRM方式!但出现刷新效率不高的问题! 因为一直没有真正的应用在产品中,所以也就放下了! 最近开发上需要考虑低成本,低内存的…...
5、布局管理器
5、布局管理器 一、流式布局 package com.dryant.lesson1;import java.awt.*;public class TestFlowLayout {public static void main(String[] args) {Frame frame new Frame();Button button1 new Button("bt1");Button button2 new Button("bt2");…...
What is a UDP Flood Attack?
用户数据报协议 (UDP) 是计算机网络中使用的无连接、不可靠的协议。它在互联网协议 (IP) 的传输层上运行,并提供跨网络的快速、高效的数据传输。与TCP(其更可靠的对应物)不同,UDP不提…...
多核 ARM Server 性能调优
概述 thinkforce ARM Server是多核心ARM服务器,硬件环境资源如下: CPU信息如下: yuxunyuxun:/$ lscpu Architecture: aarch64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian …...
oracle执行计划中,同一条语句块,在不同情况下执行计划不一样问题。子查询,union 导致索引失效。
场景: 需要获取部分数据集(视图)的业务时间最大值,希望只通过一条语句获取多个的最大值。 则使用select (视图1业务时间最大值),(视图2业务时间最大值),(视图3业务时间最大值) from dual 程序执行过程中,发现语句执行较慢,则进行s…...
【新的小主机】向日葵远程控制ubuntu
向日葵远程控制ubuntu 一、简介二、问题及解决方法2.1 向日葵远程连接Ubuntu22主机黑屏?2.2 Ubuntu如何向日葵开机自启?2.3 无显示器情况下,windows远程桌面连接Ubuntu? 三、待续。。。 一、简介 系统:ubuntu22.04.3 目的&#…...
在Android studio高版本上使用低版本的Github项目库报错未能解析:Landroid/support/v4/app/FrageActivity;
我在我的项目中有一个导包: // 基础依赖包,必须要依赖 沉浸式狀態欄 implementation com.gyf.immersionbar:immersionbar:3.0.0 但是我的as版本比较高,我使用这个导包里面的方法会直接报错: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/suppor…...
自动混剪多段视频、合并音频、添加文案的技巧分享
在如今的社交媒体时代,视频的重要性越来越被人们所重视。许多人喜欢记录生活中的美好瞬间,并将其制作成视频分享给朋友和家人。然而,对于那些拍摄了大量视频的人来说,一个一个地进行剪辑和合并可能是一项令人头痛的任务。但是&…...
学习笔记——BSGS
众所周知,北上广深是中国非常一线的城市,北京是首都,地处…… 正片开始! 一、BSGS基础算法 实现目标: A x ≡ B ( m o d P ) , ( gcd ( P , A ) 1 ) A^x\equiv B(\mod P),(\gcd(P,A)1) Ax≡B(modP),(gcd(P,A)1)…...
【AI视野·今日NLP 自然语言处理论文速览 第四十期】Mon, 25 Sep 2023
AI视野今日CS.NLP 自然语言处理论文速览 Mon, 25 Sep 2023 Totally 46 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers ReConcile: Round-Table Conference Improves Reasoning via Consensus among Diverse LLMs Authors Justin C…...
Linux C/C++下收集指定域名的子域名信息(类似dnsmap实现)
我们知道dnsmap是一个工具,主要用于收集指定域名的子域名信息。它对于渗透测试人员在基础结构安全评估的信息收集和枚举阶段非常有用,可以帮助他们发现目标公司的IP网络地址段、域名等信息。 dnsmap的操作原理 dnsmap(DNS Mappingÿ…...
linux-定时任务
目录 一、crond命令 1、什么是计划任务 2、crond服务的概念 3、crontab 二、at命令 1、at任务的概念 三、邮件服务 1、概念 2、启动postfix 四、mailx命令 1、三个概念: 2、交互式发邮件 3、非交互式发邮件 四、cron定时任务实践 1、系统定时任务配置…...
在Spring Boot项目中使用Redisson
在Spring Boot项目中使用Redisson Redisson简介 Redisson官网仓库 Redisson中文文档 Redission是一个基于Java的分布式缓存和分布式任务调度框架,用于处理分布式系统中的缓存和任务队列。它是一个开源项目,旨在简化分布式系统的开发和管理。 以下是…...
JavaScript 函数柯里化
🎶什么是柯里化 柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。 🎡简单的函数柯里化的实现 // ------------- 原函数…...
springboot实现ACL+RBAC权限体系
本文基于web系统的权限控制非常重要的前提下,从ALC和RBAC权限控制两个方面,介绍如何在springboot项目中实现一个完整的权限体系。 源码下载 :https://gitee.com/skyblue0678/springboot-demo 序章 一个后台管理系统,基本都有一套…...
C++20协程示例
C20协程示例 认识协程 在C中,协程就是一个可以暂停和恢复的函数。 包含co_wait、co_yield、co_return关键字的都可以叫协程。 看一个例子: MyCoroGenerator<int> testFunc(int n) {std::cout << "Begin testFunc" << s…...
【Verilog 教程】6.2Verilog任务
关键词:任务 任务与函数的区别 和函数一样,任务(task)可以用来描述共同的代码段,并在模块内任意位置被调用,让代码更加的直观易读。函数一般用于组合逻辑的各种转换和计算,而任务更像一个过程&a…...
Spring修炼之路(1)基础入门
一、简介 1.1Spring概述 Spring框架是一个轻量级的Java开发框架,它提供了一系列底层容器和基础设施,并可以和大量常用的开源框架无缝集成,可以说是开发Java EE应用程序的必备。Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&…...
GANs学习记录
GAN 基于GAN的研究识别相关不同背景目标图像 可以用Augmentation2021.3.15 基于GAN的研究 是通过GAN 进行图像重建,恢复细节,去模糊,提高图像质量,图像还原,去噪等等。 识别相关 一种基于生成对抗网络的训练样本扩充…...
Flink-CDC——MySQL、SqlSqlServer、Oracle、达梦等数据库开启日志方法
目录 1. 前言 2. 数据源安装与配置 2.1 MySQL 2.1.1 安装 2.1.2 CDC 配置 2.2 Postgresql 2.2.1 安装 2.2.2 CDC 配置 2.3 Oracle 2.3.1 安装 2.3.2 CDC 配置 2.4 SQLServer 2.4.1 安装 2.4.2 CDC 配置 2.5达梦 2.4.1安装 2.4.2CDC配置 3. 验证 3.1 Flink版…...
linux设置tomcat redis开机自启动
设置Tomcat自启动 1.修改 /etc/rc.d/rc.local 文件 [rootiowZ]# vim /etc/rc.d/rc.local在/etc/rc.d/rc.local文件最后加上: export JAVA_HOME/usr/local/jdk /usr/local/apache-tomcat-8.5.73/bin/startup.sh start退出vim并保存修改的文件。 说明:/u…...
跨域问题讨论
问题 跨域定义 当一个请求url的协议、域名、端口三者之间任意一个与当前页面地址不同即为跨域。 跨域的安全隐患(CSRF攻击) 也就是说,一旦允许跨域,意味着允许恶意网站随意攻击可信网站,带来安全风险。 这里面有一…...
ESP32设备通信-两个ESP32设备之间HTTP通信
两个ESP32设备之间HTTP通信 文章目录 两个ESP32设备之间HTTP通信1、应用介绍2、软件准备3、硬件准备4、代码实现4.1 ESP32服务器节点代码4.2 ESP32客户端节点代码在本文中,我们将介绍如何在没有任何物理路由器或互联网连接的情况下使用 Wi-Fi 在两个 ESP32 开发板之间执行无线…...
数据结构学习笔记——查找算法中的树形查找(平衡二叉树)
目录 一、平衡二叉树的定义二、平衡因子三、平衡二叉树的插入和构造(一)LL型旋转(二)LR型旋转(三)RR型旋转(四)RL型旋转 四、平衡二叉树的删除(一)叶子结点&a…...
P1830 轰炸III
题目背景 一个大小为 ��nm 的城市遭到了 �x 次轰炸,每次都炸了一个每条边都与边界平行的矩形。 题目描述 在轰炸后,有 �y 个关键点,指挥官想知道,它们有没有受到过轰炸,如…...
大语言模型LLM知多少?
你知道哪些流行的大语言模型?你都体验过哪写? GPT-4,Llamma2, T5, BERT 还是 BART? 1.GPT-4 1.1.GPT-4 模型介绍 GPT-4(Generative Pre-trained Transformer 4)是由OpenAI开发的一种大型语言模型。GPT-4是前作GPT系列模型的进一步改进,旨在提高语言理解和生成的能力,…...
Redis命令行使用Lua脚本
Redis命令行使用Lua脚本 Lua脚本在Redis中的使用非常有用,它允许你在Redis服务器上执行自定义脚本,可以用于复杂的数据处理、原子性操作和执行多个Redis命令。以下是Lua脚本在Redis中的基本使用详细讲解: 运行Lua脚本: 在Redis中…...
HTML详细基础(三)表单控件
本帖介绍web开发中非常核心的标签——表格标签。 在日常我们使用到的各种需要输入用户信息的场景——如下图,均是通过表格标签table创造出来的: 目录 一.表格标签 二.表格属性 三.合并单元格 四.无序列表 五.有序列表 六.自定义标签 七.表单域 …...
map和set的具体用法 【C++】
文章目录 关联式容器键值对setset的定义方式set的使用 multisetmapmap的定义方式insertfinderase[]运算符重载map的迭代器遍历 multimap 关联式容器 关联式容器里面存储的是<key, value>结构的键值对,在数据检索时比序列式容器效率更高。比如:set…...
聚合统一,SpringBoot实现全局响应和全局异常处理
目录 前言 全局响应 数据规范 状态码(错误码) 全局响应类 使用 优化 全局异常处理 为什么需要全局异常处理 业务异常类 全局捕获 使用 优化 总结 前言 在悦享校园1.0版本中的数据返回采用了以Map对象返回的方式,虽然较为便捷但也带来一些问题。一是在…...
WordPress网站转HTPPS/在线识图
1.树的定义: (1)有且只有一个称为根的节点。 (2)有若干个互不相交的子树,这些子树本身也是一棵树。 eg: 2.通俗的定义: (1)树由节点和边组成。 (2…...
做暧暧视频网站免费/优化师是做什么的
▲点击上方 雷锋网 关注华为已经宣布方舟编译器会从 2019 年全面开源。文 | I/O 2019 年 4 月 11 日,在上海的华为新品发布会上,除了可以拍月亮的华为 P30 系列,余承东还亲自抛出了两项软件层面的“重磅炸弹”,分别是方舟编译器和…...
博客社区类网站模板下载/网站怎么建立
本节知识点:Ionic之form表单实现MVVM,模拟数据提交或信息注册案例。 效果展示: 【ion-input】单行文本框 <ion-item-divider><ion-label>用户基本信息</ion-label></ion-item-divider><ion-item><ion-labe…...
wordpress子菜单位置/最经典最常用的网站推广方式
一、copy 头文件algorithm template <class InputIterator, class OutputIterator>OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result);复制元素范围 将[first,last]范围内的元素复制到从result开始的范围内。 该函数…...
dede图片网站模板/广州seo推广运营专员
在与财务相关的应用中,经常会用到人民币金额的大写,比如发票的打印程序。 本题的任务是:从键盘输入一个十亿以内的正整数(int类型),把它转换为人民币金额大写(不考虑用户输入错误的情况…...
郑州品牌网站建设官网/免费技能培训在哪里报名
目录 Kafka的基本介绍Kafka的设计原理分析Kafka数据传输的事务特点Kafka消息存储格式副本(replication)策略Kafka消息分组,消息消费原理Kafak顺序写入与数据读取消费者(读取数据) Kafka的基本介绍 Kafka是最初由Lin…...