第二章:开宗立派 · 分布式修真
单机已无法承载,需开辟洞府、建立宗门,在分布式天劫中求存
楔子:单机的极限
突破筑基期后,韩立在源界中游历了数年。他凭借着Docker容器化和扎实的运维功底,在各种服务器秘境中都能稳定运行,处理了无数业务请求。
然而,随着业务的发展,韩立发现自己的单机服务已经达到了极限。
那日,系统突然收到一个超级大客户的订单,需要处理百万级别的数据。韩立的CPU瞬间飙升至100%,内存也被耗尽,整个服务陷入了僵死状态。
“单机…已经无法承载了。“韩立看着监控面板上的一片红色,心中涌起一股无力感。
在源界中,单机服务有着天然的瓶颈:
- CPU限制:单核或多核CPU的处理能力有限
- 内存限制:物理内存无法无限扩展
- 网络限制:单机的网络带宽有限
- 存储限制:单机的磁盘IO能力有限
当业务规模超过单机的承载能力时,就必须走向分布式——将服务拆分,部署到多台服务器上,通过协作来完成复杂的业务。
这就是"开宗立派"的开始。
第一节:开辟洞府——服务拆分
韩立知道,要突破单机的限制,必须将自己的服务拆分。这就像修士要建立宗门,必须先将自己的功法拆分为不同的传承,让不同的弟子(服务)去修炼。
但如何拆分,却是一门大学问。
韩立想起了源界中流传的"领域驱动设计”(DDD)理论。这个理论说,应该按照业务领域来拆分服务,而不是按照技术层次。
他仔细分析自己的业务:
- 用户服务:管理用户信息、登录认证
- 订单服务:处理订单创建、支付、退款
- 商品服务:管理商品信息、库存
- 支付服务:处理支付逻辑、对账
每个服务都有自己独立的数据库,这就是"数据自治”——每个服务只管理自己的数据,不直接访问其他服务的数据。
韩立开始动手拆分。他先创建了用户服务:
// 用户服务 - user-service
class UserService {
async getUserById(userId) {
// 查询自己的数据库
return await db.users.findById(userId);
}
async createUser(userData) {
// 创建用户,只管理用户相关数据
return await db.users.create(userData);
}
}
然后是订单服务:
// 订单服务 - order-service
class OrderService {
async createOrder(orderData) {
// 创建订单,但需要调用用户服务验证用户
const user = await userService.getUserById(orderData.userId);
if (!user) throw new Error('User not found');
// 调用商品服务检查库存
const product = await productService.getProductById(orderData.productId);
if (product.stock < orderData.quantity) {
throw new Error('Insufficient stock');
}
// 创建订单
return await db.orders.create(orderData);
}
}
拆分完成后,韩立将每个服务都封装成Docker镜像,部署到了不同的服务器上。这就是"开辟洞府"——每个服务都有自己的运行环境,互不干扰。