在 SignalR 中实现向自定义组发送消息的最佳实践
Best practice to implement sending message to custom groups in SignalR
我正在使用 SignalR 开发实时多人游戏。消息传递逻辑不是很简单,我无法使用组来处理它。
例如,一条消息将传递给具有某些自定义 属性 等于某个动态值的用户。这意味着
无法处理目标受众
Clients.All
Clients.AllExcept
我有一个映射 class 是这样的:
public class Player
{
public dynamic Client { get; set; }
public string ConnectionId { get; set; }
public string Name { get; set; }
}
我确实在列表对象中检测到我的所有受众。
向列表中的每个人发送消息的最佳方式是什么?通过列表枚举并调用
foreach (var loopPlayer in players)
{
player.Client.sendMessage(message);
}
或
List<string> ids = new List<string>();
foreach (var loopPlayer in players)
{
ids.Add(item.ConnectionId.ToString());
}
Clients.Clients(ids).sendMessage(message);
我对第一个的担心是,它每次都会序列化消息。关于第二个,我不知道它在幕后是如何工作的。
这两种方法都有效,但我担心性能问题并试图找到最佳实践。或者我可能会使用哪种其他方法?
如您所说,每次都枚举客户端序列化消息(并将这些序列化消息存储在内部缓冲区等中)。如果消息相同,这是不必要的 CPU\memory 开销。
Clients.Clients(ids)
仅对消息进行一次序列化,以提高性能,绝对可行。
消息传递逻辑不是很简单,我无法使用组来处理它。例如,一条消息将传递给具有一些自定义 属性 等于某个动态值的用户。
组在开箱即用的横向扩展场景中工作,如果您发现自己需要横向扩展,这将是一个巨大的好处。因此,也许可以尝试找到一些方法来简化 "group assigment logic",即使代价是向更多客户端传递一些消息并在 "filtering" 客户端...
我正在使用 SignalR 开发实时多人游戏。消息传递逻辑不是很简单,我无法使用组来处理它。
例如,一条消息将传递给具有某些自定义 属性 等于某个动态值的用户。这意味着
无法处理目标受众Clients.All
Clients.AllExcept
我有一个映射 class 是这样的:
public class Player
{
public dynamic Client { get; set; }
public string ConnectionId { get; set; }
public string Name { get; set; }
}
我确实在列表对象中检测到我的所有受众。
向列表中的每个人发送消息的最佳方式是什么?通过列表枚举并调用
foreach (var loopPlayer in players)
{
player.Client.sendMessage(message);
}
或
List<string> ids = new List<string>();
foreach (var loopPlayer in players)
{
ids.Add(item.ConnectionId.ToString());
}
Clients.Clients(ids).sendMessage(message);
我对第一个的担心是,它每次都会序列化消息。关于第二个,我不知道它在幕后是如何工作的。
这两种方法都有效,但我担心性能问题并试图找到最佳实践。或者我可能会使用哪种其他方法?
如您所说,每次都枚举客户端序列化消息(并将这些序列化消息存储在内部缓冲区等中)。如果消息相同,这是不必要的 CPU\memory 开销。
Clients.Clients(ids)
仅对消息进行一次序列化,以提高性能,绝对可行。
消息传递逻辑不是很简单,我无法使用组来处理它。例如,一条消息将传递给具有一些自定义 属性 等于某个动态值的用户。
组在开箱即用的横向扩展场景中工作,如果您发现自己需要横向扩展,这将是一个巨大的好处。因此,也许可以尝试找到一些方法来简化 "group assigment logic",即使代价是向更多客户端传递一些消息并在 "filtering" 客户端...