From 14c2d65296d98bdbaa14e967b5b45aeaf5351e57 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 17:36:26 +0800 Subject: [PATCH 01/14] add docs --- docs/blog/golang/_category_.json | 2 +- docs/blog/golang/architectural/_category_.json | 2 +- docs/blog/golang/optimization/_category_.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/blog/golang/_category_.json b/docs/blog/golang/_category_.json index c16f26f847..591e62dfcc 100644 --- a/docs/blog/golang/_category_.json +++ b/docs/blog/golang/_category_.json @@ -1,6 +1,6 @@ { "position": 2, - "label": "Golang", + "label": "IMSDK/Server", "collapsible": true, "collapsed": true } diff --git a/docs/blog/golang/architectural/_category_.json b/docs/blog/golang/architectural/_category_.json index 583bad1553..45731c03a9 100644 --- a/docs/blog/golang/architectural/_category_.json +++ b/docs/blog/golang/architectural/_category_.json @@ -1,6 +1,6 @@ { "position": 3, - "label": "架构与选型", + "label": "架构设计", "collapsible": true, "collapsed": true } diff --git a/docs/blog/golang/optimization/_category_.json b/docs/blog/golang/optimization/_category_.json index a9d230449a..b7b4009689 100644 --- a/docs/blog/golang/optimization/_category_.json +++ b/docs/blog/golang/optimization/_category_.json @@ -1,6 +1,6 @@ { "position": 2, - "label": "性能与优化", + "label": "系统优化", "collapsible": true, "collapsed": true } From 0608706f07246aa6488e2cec331d08981d37afb7 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 17:56:12 +0800 Subject: [PATCH 02/14] add docs --- docs/blog/introduction.mdx | 82 +++++++++++++++++++++++++++++++++++++- 1 file changed, 81 insertions(+), 1 deletion(-) diff --git a/docs/blog/introduction.mdx b/docs/blog/introduction.mdx index ed4b455773..26c33864dc 100644 --- a/docs/blog/introduction.mdx +++ b/docs/blog/introduction.mdx @@ -3,5 +3,85 @@ title: introduction hide_title: true sidebar_position: 1 --- +# OpenIM 技术分享 -## OpenIM Blog \ No newline at end of file +## 一、项目背景与发展历程 + +OpenIM 从启动开源项目到现在,已经走过了 5 个年头。目前已迭代了三个大版本,功能和性能逐步得到完善与优化。 + +### V3.x 系列目标 + 功能更加全面,引入了多级缓存、分布式部署方案,支持更大规模的业务场景。目前开源版将持续维护 3.8 版本,已经在稳定运行。 + +5 年的演进过程中,团队在架构设计、组件选型以及开发实践等方面沉淀了许多经验,也经历了诸多挑战。接下来将结合实际案例,分享我们在项目中的一些关键思路和实践经验。也希望能并借此机会和大家交流。 + +--- + +## 二、性能与一致性:多级缓存体系 + +在即时通讯领域,性能通常是评估系统可用性的核心指标之一,而缓存则是解决性能瓶颈的常见手段。 + +### 多级缓存结构 + +1. **本地缓存** + 存储核心高频数据,例如客户端存储消息,会话,群组等。 + +2. **分布式缓存(Redis)** + 通过 Redis 等分布式缓存存储共享数据,提高全局访问效率。 + +3. **持久化存储(MongoDB)** + 持久化保存历史消息、用户资料等关键业务数据,保证数据安全与可追溯。 + +### 数据一致性 + +多级缓存带来性能提升的同时,也面临数据一致性的挑战。我们通过以下手段来保障数据一致性: + +- **合理的失效策略** + 引入rockscache组件解决分布式缓存的一致性问题。 + +- **消息队列异步通知** + 当数据发生改变时,通过IM的通知机制,确保数据高度同步,并使用增量减少网络流量,提升同步效率。 + +--- + +## 三、组件选型:MongoDB、Redis、Kafka 各显神通 + +随着业务规模的增大,以及对实时性要求的提升,如何选型合适的组件至关重要。OpenIM 的技术栈中,MongoDB、Redis、Kafka 是不可或缺的三大核心组件,它们各有优势、彼此不可替代。 + +### MongoDB + +- 适用于存储海量非结构化或半结构化数据,如聊天记录、群组信息等。 +- 支持灵活的文档模型,易于实现某些查询和聚合操作。 + +### Redis + +- 超高性能的内存数据库,提供多种数据结构适用于缓存场景。 +- 通过持久化与集群功能,在保证性能的前提下具备一定的容灾能力。 + +### Kafka + +- 高吞吐量的消息队列,用于消息异步处理、系统解耦。 +- 通过分区与副本机制,保证系统在高并发场景下的可靠性与伸缩性。 + +在项目实践中,我们会根据具体业务需求,综合利用这些组件,让每种工具发挥它的特长,实现高可用、高并发的系统架构。 + +--- + +## 四、开发实践:反射、泛型与工具链 + +代码的简洁与维护成本往往有着正相关:越是简洁的代码,越能避免重复造轮子,提高可读性与扩展性。 + +### 反射与泛型的妙用 + +- **反射** + 反射能极大减少冗余代码,减少耦合。 + +- **泛型** + 在处理相似逻辑、相似对象时,大量使用泛型可以减少重复代码,提高扩展性。 + +### 工具链的构建和启停 + +- **跨平台构建** + 为了适配多平台环境(Linux、Mac、Windows 等),项目编译使用mage,避免引入各种脚本。 + +- **一键启停与运维** + 统一使用mage工具,实现对各个服务的启动、停止、日志查看等功能,一键搞定,降低运维门槛。 From b7f5fd07d159c0e3b780c5d30087482487b0bcfc Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 18:01:17 +0800 Subject: [PATCH 03/14] add docs --- docs/blog/golang/architectural/_category_.json | 2 +- docs/blog/golang/architectural/example.mdx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/blog/golang/architectural/_category_.json b/docs/blog/golang/architectural/_category_.json index 45731c03a9..f0affd4222 100644 --- a/docs/blog/golang/architectural/_category_.json +++ b/docs/blog/golang/architectural/_category_.json @@ -1,5 +1,5 @@ { - "position": 3, + "position": 1, "label": "架构设计", "collapsible": true, "collapsed": true diff --git a/docs/blog/golang/architectural/example.mdx b/docs/blog/golang/architectural/example.mdx index 339aac634a..baf12404e9 100644 --- a/docs/blog/golang/architectural/example.mdx +++ b/docs/blog/golang/architectural/example.mdx @@ -1,5 +1,5 @@ --- -title: Example +title: 服务端整体架构 hide_title: true sidebar_position: 1 --- From 3c5b8bca343c46573baf6481c3a9a56f61af3eda Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 18:04:22 +0800 Subject: [PATCH 04/14] add docs --- docs/blog/golang/optimization/example.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/golang/optimization/example.mdx b/docs/blog/golang/optimization/example.mdx index 339aac634a..af914bbe3a 100644 --- a/docs/blog/golang/optimization/example.mdx +++ b/docs/blog/golang/optimization/example.mdx @@ -1,5 +1,5 @@ --- -title: Example +title: GRPC client自动化 hide_title: true sidebar_position: 1 --- From 97ac51e2fe40572daac3e47974d52e10f29c3477 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 18:05:49 +0800 Subject: [PATCH 05/14] add docs --- docs/blog/golang/optimization/2.mdx | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/blog/golang/optimization/2.mdx diff --git a/docs/blog/golang/optimization/2.mdx b/docs/blog/golang/optimization/2.mdx new file mode 100644 index 0000000000..489ed66898 --- /dev/null +++ b/docs/blog/golang/optimization/2.mdx @@ -0,0 +1,5 @@ +--- +title: 缓存机制的设计与实现 +hide_title: true +sidebar_position: 2 +--- From 35fb87460342cebff70786944f7f754dd1f7d6da Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 18:07:42 +0800 Subject: [PATCH 06/14] add docs --- docs/blog/golang/optimization/3.mdx | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/blog/golang/optimization/3.mdx diff --git a/docs/blog/golang/optimization/3.mdx b/docs/blog/golang/optimization/3.mdx new file mode 100644 index 0000000000..e63a551889 --- /dev/null +++ b/docs/blog/golang/optimization/3.mdx @@ -0,0 +1,5 @@ +--- +title: RPC端口自动获取 +hide_title: true +sidebar_position: 3 +--- From 421f6d29b123417bdf0b7ceb8d0882df8678e2f7 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 18:08:10 +0800 Subject: [PATCH 07/14] add docs --- docs/blog/golang/optimization/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/golang/optimization/3.mdx b/docs/blog/golang/optimization/3.mdx index e63a551889..e4055b40de 100644 --- a/docs/blog/golang/optimization/3.mdx +++ b/docs/blog/golang/optimization/3.mdx @@ -1,5 +1,5 @@ --- -title: RPC端口自动获取 +title: 服务端热重启方案设计 hide_title: true sidebar_position: 3 --- From b1fa1447374ae8742094cd4b624aa131d4f8d4cb Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 18:09:20 +0800 Subject: [PATCH 08/14] add docs --- docs/blog/golang/optimization/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/golang/optimization/3.mdx b/docs/blog/golang/optimization/3.mdx index e4055b40de..1985bd031e 100644 --- a/docs/blog/golang/optimization/3.mdx +++ b/docs/blog/golang/optimization/3.mdx @@ -1,5 +1,5 @@ --- -title: 服务端热重启方案设计 +title: API一行调用RPC hide_title: true sidebar_position: 3 --- From 2ecb86011a4b1403bc1231798e3046b62b602ded Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 18:09:47 +0800 Subject: [PATCH 09/14] add docs --- docs/blog/golang/optimization/example.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/golang/optimization/example.mdx b/docs/blog/golang/optimization/example.mdx index af914bbe3a..249de316ff 100644 --- a/docs/blog/golang/optimization/example.mdx +++ b/docs/blog/golang/optimization/example.mdx @@ -1,5 +1,5 @@ --- -title: GRPC client自动化 +title: RPC client自动化 hide_title: true sidebar_position: 1 --- From 30275931849d0c8db51c731a058cca39b5847c3c Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 18:10:28 +0800 Subject: [PATCH 10/14] add docs --- docs/blog/golang/optimization/4.mdx | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 docs/blog/golang/optimization/4.mdx diff --git a/docs/blog/golang/optimization/4.mdx b/docs/blog/golang/optimization/4.mdx new file mode 100644 index 0000000000..e40ce285a7 --- /dev/null +++ b/docs/blog/golang/optimization/4.mdx @@ -0,0 +1,7 @@ +--- +title: 十万大群的推送优化 +hide_title: true +sidebar_position: 3 +--- + + From 059d3f1d6c077430ae8d0b26f2accc47cfd81274 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 18:12:07 +0800 Subject: [PATCH 11/14] add docs --- docs/blog/golang/optimization/3.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/golang/optimization/3.mdx b/docs/blog/golang/optimization/3.mdx index 1985bd031e..b699749493 100644 --- a/docs/blog/golang/optimization/3.mdx +++ b/docs/blog/golang/optimization/3.mdx @@ -1,5 +1,5 @@ --- -title: API一行调用RPC +title: API精简方案 hide_title: true sidebar_position: 3 --- From 5717df2f5d98d410c651851ae1421a9e746688f1 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 18:14:17 +0800 Subject: [PATCH 12/14] add docs --- docs/blog/golang/architectural/2.mdx | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/blog/golang/architectural/2.mdx diff --git a/docs/blog/golang/architectural/2.mdx b/docs/blog/golang/architectural/2.mdx new file mode 100644 index 0000000000..4618b7e66c --- /dev/null +++ b/docs/blog/golang/architectural/2.mdx @@ -0,0 +1,5 @@ +--- +title: 消息系统 +hide_title: true +sidebar_position: 2 +--- From 350bff3f894e5d79e9995b6cc57ec685938a17f6 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 18:16:21 +0800 Subject: [PATCH 13/14] add docs --- docs/blog/introduction.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/blog/introduction.mdx b/docs/blog/introduction.mdx index 26c33864dc..8b8c791e0d 100644 --- a/docs/blog/introduction.mdx +++ b/docs/blog/introduction.mdx @@ -10,7 +10,7 @@ sidebar_position: 1 OpenIM 从启动开源项目到现在,已经走过了 5 个年头。目前已迭代了三个大版本,功能和性能逐步得到完善与优化。 ### V3.x 系列目标 - 功能更加全面,引入了多级缓存、分布式部署方案,支持更大规模的业务场景。目前开源版将持续维护 3.8 版本,已经在稳定运行。 + 功能更加全面,引入了多级缓存、分布式部署方案,支持更大规模的业务场景。目前开源版将持续维护 3.8 版本和商业版,其他版本不再维护。 5 年的演进过程中,团队在架构设计、组件选型以及开发实践等方面沉淀了许多经验,也经历了诸多挑战。接下来将结合实际案例,分享我们在项目中的一些关键思路和实践经验。也希望能并借此机会和大家交流。 From 3bc4c86936b3c78ef246c1ed94f99c1c2ce39869 Mon Sep 17 00:00:00 2001 From: skiffer-git <44203734@qq.com> Date: Tue, 24 Dec 2024 18:18:01 +0800 Subject: [PATCH 14/14] add docs --- docs/blog/golang/architectural/3.mdx | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/blog/golang/architectural/3.mdx diff --git a/docs/blog/golang/architectural/3.mdx b/docs/blog/golang/architectural/3.mdx new file mode 100644 index 0000000000..64dc2f7c52 --- /dev/null +++ b/docs/blog/golang/architectural/3.mdx @@ -0,0 +1,5 @@ +--- +title: 文件断点续传的设计 +hide_title: true +sidebar_position: 3 +---