我目前正在致力于将实时聊天功能集成到我们的产品网站中。我使用的技术堆栈包括后端使用 ASP.NET Core 的 SignalR 和前端使用 Angular 10。
在实现过程中,我考虑了两种从用户向管理员发送消息的方法:
使用连接 ID 向单个用户发送消息:
public async Task SendToUser(string user, string receiverConnectionId, string message, string imgurl)
{
await Clients.Client(Context.ConnectionId).SendAsync("ReceiveMessage", user, message, imgurl);
}
通过创建动态组向管理员发送消息:
var roomname = user_admin;
await Clients.Group(roomname)
.SendAsync("ReceiveMessage", userRoomConnection.User, message, DateTime.Now);
我在这两种方法之间左右为难。一方面,使用连接 ID 直接向单个用户发送消息似乎简单且高效。另一方面,为每个新用户创建一个动态组来向管理员发送消息可能会提供更大的灵活性和可扩展性。
哪种方法在性能、可扩展性和整体最佳实践方面更好?对于这两种方法,我是否应该注意任何潜在的陷阱或注意事项?
我不确定这是否有助于您的决定,但 signalR 中的“组”在大多数情况下并不像您所期望的那样。该信息只是丢失地存储,并且根本不保留在服务器端。也没有 API 来获取群组成员身份...等等。
https://learn.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/working-with-groups
当我们制作一个实现 SignalR(并允许可扩展性)的企业应用程序(Web 和移动)时,我的首选方法是使用限定符或鉴别器字段来维护我们自己的连接集合。当我们需要发送给一组用户时,我们只需使用鉴别器收集该列表服务器端,然后发送消息。
SignalR 提供了非常好的方法来发送到连接集合。
如果您滚动并阅读上面的链接,他们基本上就是在“在数据库中存储组”部分中执行的操作