Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/blog/golang/_category_.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"position": 2,
"label": "Golang",
"label": "IMSDK/Server",
"collapsible": true,
"collapsed": true
}
Expand Down
5 changes: 5 additions & 0 deletions docs/blog/golang/architectural/2.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: 消息系统
hide_title: true
sidebar_position: 2
---
5 changes: 5 additions & 0 deletions docs/blog/golang/architectural/3.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: 文件断点续传的设计
hide_title: true
sidebar_position: 3
---
4 changes: 2 additions & 2 deletions docs/blog/golang/architectural/_category_.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"position": 3,
"label": "架构与选型",
"position": 1,
"label": "架构设计",
"collapsible": true,
"collapsed": true
}
Expand Down
2 changes: 1 addition & 1 deletion docs/blog/golang/architectural/example.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: Example
title: 服务端整体架构
hide_title: true
sidebar_position: 1
---
5 changes: 5 additions & 0 deletions docs/blog/golang/optimization/2.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: 缓存机制的设计与实现
hide_title: true
sidebar_position: 2
---
5 changes: 5 additions & 0 deletions docs/blog/golang/optimization/3.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
title: API精简方案
hide_title: true
sidebar_position: 3
---
7 changes: 7 additions & 0 deletions docs/blog/golang/optimization/4.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
title: 十万大群的推送优化
hide_title: true
sidebar_position: 3
---


2 changes: 1 addition & 1 deletion docs/blog/golang/optimization/_category_.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"position": 2,
"label": "性能与优化",
"label": "系统优化",
"collapsible": true,
"collapsed": true
}
Expand Down
2 changes: 1 addition & 1 deletion docs/blog/golang/optimization/example.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: Example
title: RPC client自动化
hide_title: true
sidebar_position: 1
---
82 changes: 81 additions & 1 deletion docs/blog/introduction.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,85 @@ title: introduction
hide_title: true
sidebar_position: 1
---
# OpenIM 技术分享

## OpenIM Blog
## 一、项目背景与发展历程

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工具,实现对各个服务的启动、停止、日志查看等功能,一键搞定,降低运维门槛。