如何设置发布/订阅系统-Steven Lacerda(加利福尼亚州摩根希尔)

当我开始这个项目时,在建立发布/订阅机制时,缺乏满足我确切需求的信息使我感到困惑。 我的情况需要React客户端,并使用websocketsharp服务器端的c#。

因此,我正在为遇到类似问题的其他任何人写这篇文章。

客户端设置很有趣,因为单个客户端可以不止一次订阅同一频道,并且对每个订阅执行不同的回调。 这意味着,不仅要有几个回调,而且还要跟踪这些回调。 因此,这是客户端的最终结果。

注意:socket是我将套接字连接存储在其中的变量。您应该具有类似的内容,以便在连接套接字时,将连接响应保存在变量中。 然后,您可以从socket.FUNCTION_NAME()调用这些函数。

订阅将每个用户的订阅存储为:

  this._channels = {CHANNEL_NAME:[{id:3492–323–234343–1234,回调:SOME_FUNCTION}等…],CHANNEL_NAME:[{id:3492–323–234343–1234,回调:SOME_FUNCTION},等等…] ,} 

使用这种格式,我们可以为同一个通道存储多个回调,并且使用唯一的ID,我们可以存储每个函数并知道哪个函数属于哪个函数。 请注意,我们返回了唯一ID,因此您应该将此唯一ID存储在客户代码中的某个位置。

 订阅:功能订阅(渠道,回调){var self = this;  var id = self._getNextId();  var randomId = self.randomIdGenerator();  var channelObj = {id:randomId,callback:callback} if(self._channels [channel]){self._channels [channel] .push(channelObj);  } else {self._channels [channel] = [];  self._channels [channel] .push(channelObj);  } self._send({msg:'method',method:'pubsub.subscribe',channel:channel,id:id}); 返回randomId;} 

我们还需要建立一个重新订阅功能,以防服务器出现故障,我们需要它来重置订阅。 因此,当断开连接并重新连接时,应调用此方法。

 重新订阅:函数resubscribe(){var self = this;  var id = self._getNextId();  self._send({msg:'method',method:'pubsub.resubscribe',channel:Object.keys(this._channels),id:id,})} 

完成后,您还应该退订频道,这是唯一ID的重点。 为了确定要取消订阅的回调,您需要唯一的ID。

 取消订阅:功能取消订阅(频道,唯一ID){var self = this;  var id = self._getNextId();  self._send({msg:'method',method:'pubsub.unsubscribe',channel:channel,id:id}); 让channelArray = self._channels [channel] ||  []; 让索引  for(让i = 0; i <channelArray.length; i ++){让subscriptionObj = channelArray [i]; 如果(subscriptionObj.id == uniqueId){index = i;  channelArray.splice(index,1); 返回!!索引? 真假;} 

并且,发布到频道:

  publish:function publish(channel,params){var self = this;  var id = self._getNextId();  self._send({msg:'method',method:'pubsub.publish',channel:channel,params:params,id:id,})} 

而且,这是我们的随机id生成器:

  randomIdGenerator:function randomIdGenerator(){var now = Date.now();  var first ='xxxxxxxx-xxxx'.replace(/ [xy] / g,function(c){var r = Math.random()* 16 | 0,v = c =='x'?r:(r& 0x3 | 0x8);返回v.toString(16);}); 返回`$ {first}-$ {now}`;} socket.randomIdGenerator();  //返回类似— 12345678–1234–1234567891234的内容 

从组件中调用以下套接字函数:

  const userDeleteID = socket.subscribe('user.delete',function(){//做某事}); socket.resubscribe()足以重新订阅.socket.unsubscribe('user.delete',userDeleteId)socket.publish (“ user.delete”,{额外:“有效载荷”,数据:“此处”}); 

在服务器上,只需保留频道列表和订阅者列表,因此当客户端发送socket.subscribe(’user.delete’)请求时,请添加用户信息(唯一信息,在我的情况下是id)到Dictionary …看起来像{‘user.delete’:[‘admin’,’test’]}。

当socket.publish(’user.delete’,{some:’data’})进入时,您只需将其转发到所有订阅会话。 因此,您将在SessionManager(或类似的东西)中查找会话,并将数据和通道转发到“ admin”和“ test”。

您的客户端将收到一条消息,其中包含通道以及其他可在组件中使用的有效负载。

我将向您展示此代码,但是此处的不同实现会有所不同,再加上公开公司服务器代码对我来说也不是一个好主意,因此我将由您自己决定。

不要成为您的代码的囚徒,掌握它!!!

解决问题和那些性感觉一样好……有时,好吧,也许不是。 直接从加利福尼亚州的摩根希尔(Morgan Hill)。 祝好运!