本文档详细介绍 Cyaim.WebSocketServer 的集群传输扩展,包括 Redis 和 RabbitMQ 传输实现。
Cyaim.WebSocketServer 支持四种集群传输方式:
- WebSocket (ws/wss) - 基础包提供,节点间直接通过 WebSocket 连接
- Redis - 使用 Redis Pub/Sub 进行节点间通信(扩展包)
- RabbitMQ - 使用 RabbitMQ 消息队列进行节点间通信(扩展包)
- Hybrid - 混合传输,使用 Redis 进行服务发现,使用 RabbitMQ 进行消息路由(扩展包)
- ✅ 无需额外中间件
- ✅ 低延迟
- ✅ 直接连接
- ❌ 需要节点间网络可达
- ❌ 节点数量多时连接数多
基础包已包含,无需额外安装。
var clusterOption = new ClusterOption
{
NodeId = "node1",
NodeAddress = "localhost",
NodePort = 5001,
TransportType = "ws",
Nodes = new[]
{
"ws://localhost:5002/node2",
"ws://localhost:5003/node3"
}
};
var transport = ClusterTransportFactory.CreateTransport(
loggerFactory,
clusterOption.NodeId,
clusterOption
);- 节点数量较少(< 10 个)
- 节点间网络延迟低
- 不需要额外的中间件
- ✅ 解耦节点间连接
- ✅ 支持大量节点
- ✅ 消息持久化(可选)
- ✅ 高可用性
- ❌ 需要 Redis 服务器
- ❌ 额外网络跳转
dotnet add package Cyaim.WebSocketServer.Cluster.StackExchangeRedisusing Cyaim.WebSocketServer.Cluster.StackExchangeRedis;
var clusterOption = new ClusterOption
{
NodeId = "node1",
TransportType = "redis",
RedisConnectionString = "localhost:6379",
Nodes = new[]
{
"node2",
"node3"
}
};
var transport = RedisClusterTransportFactory.CreateTransport(
loggerFactory,
clusterOption.NodeId,
clusterOption
);localhost:6379
password@localhost:6379
localhost:6379,password=password
- 节点数量较多(> 10 个)
- 需要高可用性
- 已有 Redis 基础设施
- 节点间网络复杂
- ✅ 消息队列保证
- ✅ 支持消息持久化
- ✅ 高可用性
- ✅ 灵活的路由规则
- ❌ 需要 RabbitMQ 服务器
- ❌ 额外网络跳转
dotnet add package Cyaim.WebSocketServer.Cluster.RabbitMQusing Cyaim.WebSocketServer.Cluster.RabbitMQ;
var clusterOption = new ClusterOption
{
NodeId = "node1",
TransportType = "rabbitmq",
RabbitMQConnectionString = "amqp://guest:guest@localhost:5672/",
Nodes = new[]
{
"node2",
"node3"
}
};
var transport = RabbitMQClusterTransportFactory.CreateTransport(
loggerFactory,
clusterOption.NodeId,
clusterOption
);amqp://username:password@host:port/vhost
amqp://guest:guest@localhost:5672/
- 需要消息保证
- 需要消息持久化
- 已有 RabbitMQ 基础设施
- 复杂的消息路由需求
- ✅ Redis 服务发现 - 自动节点注册和发现
- ✅ RabbitMQ 消息路由 - 可靠的消息传递保证
- ✅ 连接路由存储 - 将连接路由信息存储到 Redis,实现快速查询而无需广播
- ✅ 自动路由刷新 - 自动刷新连接路由过期时间,防止路由信息丢失
- ✅ 智能负载均衡 - 多种负载均衡策略
- ✅ 解耦设计 - 服务发现和消息路由分离
- ✅ 高可用性 - Redis 和 RabbitMQ 都支持集群模式
- ❌ 需要 Redis 和 RabbitMQ 服务器
- ❌ 配置相对复杂
# 安装核心包
dotnet add package Cyaim.WebSocketServer.Cluster.Hybrid
# 安装实现包
dotnet add package Cyaim.WebSocketServer.Cluster.Hybrid.Implementationsusing Cyaim.WebSocketServer.Cluster.Hybrid;
using Cyaim.WebSocketServer.Cluster.Hybrid.Abstractions;
using Cyaim.WebSocketServer.Cluster.Hybrid.Implementations;
using Cyaim.WebSocketServer.Infrastructure.Cluster;
// 注册 Redis 服务
builder.Services.AddSingleton<IRedisService>(provider =>
{
var logger = provider.GetRequiredService<ILogger<StackExchangeRedisService>>();
return new StackExchangeRedisService(logger, "localhost:6379");
});
// 注册 RabbitMQ 服务
builder.Services.AddSingleton<IMessageQueueService>(provider =>
{
var logger = provider.GetRequiredService<ILogger<RabbitMQMessageQueueService>>();
return new RabbitMQMessageQueueService(logger, "amqp://guest:guest@localhost:5672/");
});
// 注册混合集群传输
builder.Services.AddSingleton<IClusterTransport>(provider =>
{
var logger = provider.GetRequiredService<ILogger<HybridClusterTransport>>();
var loggerFactory = provider.GetRequiredService<ILoggerFactory>();
var redisService = provider.GetRequiredService<IRedisService>();
var messageQueueService = provider.GetRequiredService<IMessageQueueService>();
var nodeInfo = new NodeInfo
{
NodeId = "node1",
Address = "localhost",
Port = 5001,
Endpoint = "/ws",
MaxConnections = 10000,
Status = NodeStatus.Active
};
return new HybridClusterTransport(
logger,
loggerFactory,
redisService,
messageQueueService,
nodeId: "node1",
nodeInfo: nodeInfo,
loadBalancingStrategy: LoadBalancingStrategy.LeastConnections
);
});- 需要自动节点发现
- 需要智能负载均衡
- 需要高可用性
- 已有 Redis 和 RabbitMQ 基础设施
- 大规模集群部署
详细文档: 查看 Hybrid 混合集群传输文档 了解更多信息。
| 特性 | WebSocket | Redis | RabbitMQ | Hybrid |
|---|---|---|---|---|
| 安装复杂度 | ⭐ 低 | ⭐⭐ 中 | ⭐⭐ 中 | ⭐⭐⭐ 高 |
| 延迟 | ⭐⭐⭐ 低 | ⭐⭐ 中 | ⭐⭐ 中 | ⭐⭐ 中 |
| 可扩展性 | ⭐ 低 | ⭐⭐⭐ 高 | ⭐⭐⭐ 高 | ⭐⭐⭐ 高 |
| 消息保证 | ⭐⭐ 中 | ⭐⭐⭐ 高 | ⭐⭐⭐ 高 | ⭐⭐⭐ 高 |
| 持久化 | ❌ | ✅ 可选 | ✅ 可选 | ✅ 可选 |
| 高可用 | ⭐⭐ 中 | ⭐⭐⭐ 高 | ⭐⭐⭐ 高 | ⭐⭐⭐ 高 |
| 自动发现 | ❌ | ❌ | ❌ | ✅ |
| 连接路由存储 | ❌ | ❌ | ❌ | ✅ (Redis) |
| 负载均衡 | ⭐⭐ 中 | ⭐⭐ 中 | ⭐⭐ 中 | ⭐⭐⭐ 高 |
| 额外依赖 | ❌ | Redis | RabbitMQ | Redis + RabbitMQ |
- 节点数量 < 10 个
- 节点间网络延迟低
- 不需要额外的中间件
- 快速原型开发
- 节点数量 > 10 个
- 需要高可用性
- 已有 Redis 基础设施
- 节点间网络复杂
- 需要消息保证
- 需要消息持久化
- 已有 RabbitMQ 基础设施
- 复杂的消息路由需求
- 需要自动节点发现
- 需要智能负载均衡
- 需要高可用性
- 已有 Redis 和 RabbitMQ 基础设施
- 大规模集群部署(> 20 个节点)
{
"Cluster": {
"TransportType": "redis",
"RedisConnectionString": "localhost:6379",
"Nodes": ["node2", "node3"]
}
}var transportType = configuration["Cluster:TransportType"] ?? "ws";
IClusterTransport transport;
switch (transportType.ToLower())
{
case "redis":
transport = RedisClusterTransportFactory.CreateTransport(
loggerFactory, nodeId, clusterOption);
break;
case "rabbitmq":
transport = RabbitMQClusterTransportFactory.CreateTransport(
loggerFactory, nodeId, clusterOption);
break;
case "hybrid":
// Hybrid 传输需要单独配置,参考 Hybrid 文档
// transport = HybridClusterTransportFactory.Create(...);
break;
default:
transport = ClusterTransportFactory.CreateTransport(
loggerFactory, nodeId, clusterOption);
break;
}- 使用连接池
- 配置合适的超时时间
- 使用 Redis Cluster 提高性能
- 使用连接池
- 配置合适的队列大小
- 使用 RabbitMQ Cluster 提高可用性
- 检查 Redis 服务器是否运行
- 检查连接字符串是否正确
- 检查网络连接
- 查看 Redis 日志
- 检查 RabbitMQ 服务器是否运行
- 检查连接字符串是否正确
- 检查用户权限
- 查看 RabbitMQ 日志