SignalR Hub-2-Hub 与 ASP.NET Owin 中的 SQL 背板通信
SignalR Hub-2-Hub Communication with SQL Backplane in ASP.NET Owin
我有一个 ASP.NET Owin Web Api,它是负载平衡的,这意味着它有多个彼此不认识的实例。 Web api 托管一个带有 SQL 服务器背板的 SignalR 集线器(用于实例之间的同步),因此客户端可以交换消息,无论它们连接到哪个 Web api 实例。到目前为止一切正常。
客户端会话数据存储在数据库中。网络 api 需要此信息来处理客户端请求。因为从数据库中读取每个客户端请求的会话数据太慢,网络 api 只读取一次(在客户端会话的第一次请求时)并将其缓存在内存中。这也适用于网络的多个实例 api,因为每个实例都拥有自己的会话数据缓存。
但是现在应该允许客户端更改例如语言,这会导致数据库中存储的会话数据中的语言更新。处理“更改语言”请求的 Web api 实例当然可以对更改的会话数据做出反应并从其缓存中清除会话,这将导致从数据库中重新读取会话数据在下一个客户请求时。但是其他网络 api 实例不知道会话数据的变化,它们的缓存现在保存着过时的会话数据。
处理“更改语言”请求的 Web api 实例将需要以某种方式通知其他实例删除其会话 xyz 的缓存。不幸的是,这些实例彼此不认识,但所有实例都托管通过 SingalR SQL 服务器背板同步的 SignalR 集线器。
不幸的是,SignalR 集线器无法直接发送和接收消息。为此需要一个 HubConnection(客户端)。所以这个想法是当每个网络 api 实例连接到它自己的 SignalR 集线器时,它就能够向自己发送消息,然后通过 SQL 服务器传播到其他实例背板同步。但是 HubConnection 只能通过 URL (http://host:port/signalr) 建立,但是网络 api 实例不知道它自己的基础 url .
最后我的问题是:
有什么方法可以在同一进程中建立到集线器 运行 的 HubConnection 而无需提供 URL (我可以访问集线器对象)?
如果没有,SignalR 集线器是否有任何方法可以在没有客户端的情况下通过背板传播消息并收听消息(集线器-2-集线器通信)?
如果不是,我还能做些什么来通知我的负载平衡网络的其他实例 api 并建议他们放弃他们的会话数据缓存?
通过分布式缓存 (IDistributedCache) 解决,正如 Panagiotis Kanavos 在评论中提到的那样。
我有一个 ASP.NET Owin Web Api,它是负载平衡的,这意味着它有多个彼此不认识的实例。 Web api 托管一个带有 SQL 服务器背板的 SignalR 集线器(用于实例之间的同步),因此客户端可以交换消息,无论它们连接到哪个 Web api 实例。到目前为止一切正常。
客户端会话数据存储在数据库中。网络 api 需要此信息来处理客户端请求。因为从数据库中读取每个客户端请求的会话数据太慢,网络 api 只读取一次(在客户端会话的第一次请求时)并将其缓存在内存中。这也适用于网络的多个实例 api,因为每个实例都拥有自己的会话数据缓存。
但是现在应该允许客户端更改例如语言,这会导致数据库中存储的会话数据中的语言更新。处理“更改语言”请求的 Web api 实例当然可以对更改的会话数据做出反应并从其缓存中清除会话,这将导致从数据库中重新读取会话数据在下一个客户请求时。但是其他网络 api 实例不知道会话数据的变化,它们的缓存现在保存着过时的会话数据。
处理“更改语言”请求的 Web api 实例将需要以某种方式通知其他实例删除其会话 xyz 的缓存。不幸的是,这些实例彼此不认识,但所有实例都托管通过 SingalR SQL 服务器背板同步的 SignalR 集线器。
不幸的是,SignalR 集线器无法直接发送和接收消息。为此需要一个 HubConnection(客户端)。所以这个想法是当每个网络 api 实例连接到它自己的 SignalR 集线器时,它就能够向自己发送消息,然后通过 SQL 服务器传播到其他实例背板同步。但是 HubConnection 只能通过 URL (http://host:port/signalr) 建立,但是网络 api 实例不知道它自己的基础 url .
最后我的问题是: 有什么方法可以在同一进程中建立到集线器 运行 的 HubConnection 而无需提供 URL (我可以访问集线器对象)? 如果没有,SignalR 集线器是否有任何方法可以在没有客户端的情况下通过背板传播消息并收听消息(集线器-2-集线器通信)? 如果不是,我还能做些什么来通知我的负载平衡网络的其他实例 api 并建议他们放弃他们的会话数据缓存?
通过分布式缓存 (IDistributedCache) 解决,正如 Panagiotis Kanavos 在评论中提到的那样。