二维码

4.10 消息的多路分用及分区 - 数据结构 - 机器学习

1335 人阅读 | 时间:2021年01月15日 01:20
4.10 消息的多路分用及分区 - 数据结构 - 机器学习 #daohang ul li t,.reed .riqi,a.shangg,a.xiatt,a.shangg:hover,a.xiatt:hover,a.shang,a.xiat,a.shang:hover,a.xiat:hover,.reed-pinglun-anniu,span.now-page,#daohangs-around,#caidan-tubiao,#daohangs,#daohangs li,#btnPost{background-color:#D10B04;} .dinglanyou1 h3{border-bottom:3px solid #D10B04;} #dibuer{border-top:2px solid #D10B04;}.cebianlan .rongqi h3{border-bottom:1px solid #D10B04;} #edtSearch{border:1px solid #D10B04;} #daohang .zuo ul li{border-right:1px solid #;} #daohang ul li t a{border-top:1px solid #;border-right:1px solid #D10B04;} #daohang ul li t a:hover{border-right:1px solid #;} #daohang .you ul li a:hover,#daohang .zuo ul li a:hover,.reed-pinglun-anniu:hover{background-color:#;} a:hover,.reed h6 a:hover,#dibuer a:hover,.reed .riqiding,.cebianlan .rongqi li a:hover,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.shu a,#pinglun-liebiao ul.fubens li.depth-1 dl dd span.huifuliuyan a:hover,.reed-biaoti h6 span{color:#D10B04;} .reed .kan a{color:#0A0AF5;}.reed .kan a:hover{color:#D10101;} @media screen and (max-width:1492px){a.shang,a.xiat{background:none;} a.xiat:hover,a.shang:hover{background-color:#f9f9f9;background-image:none;text-decoration:none;}} var _hmt = _hmt || [];(function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s);})(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?b19db5ba3b437a9e8698d2bc8fc64334"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?2d748c9763cfc72fb7d1ccab29f0770d"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f6d451f3f1be23f3abf240c64c469c1b"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })();

当前位置:首页 » 区块链精品文章 » 正文

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646201", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646162", container: s }); })();

4.10 消息的多路分用及分区

1142 人参与  2018年10月15日 10:51  分类 : 区块链精品文章  评论

通过Gossip协议广播的消息种类较多,不同种类的消息有不同的处理逻辑。Gossip模块利用GO语言的通道,实现一个消息的多路分用接口ChannelDeMultiplexer:


type ChannelDeMultiplexer struct {
   channels []*channel
   lock     *sync.RWMutex
   closed   int32
}


其中lock是一个读写锁,用来同步对channels的处理;closed是通道是否关闭的标识,通道关闭就不能再从通道中读取数据;channels是一个channel数组,如下所示:


type channel struct {
   pred common.MessageAcceptor
   ch   chan interface{}
}


ch是缓存消息的通道,默认只能保存10个消息。节点接收到Gossip消息的时候,会调用 DeMultiplex接口。pred用来判断订阅者对某个消息是否感兴趣,感兴趣的消息会过滤出来存放在ch里,等待下一步的处理。pre的策略可以根 据业务逻辑来实现,函数定义如下:


type MessageAcceptor func(interface{}) bool


我们来看看Gossip模块实现的几种MessageAcceptor。

1)Gossip消息过滤器。Gossip模块接收到的消息类型有:GossipMessage和Signed GossipMessage,如果不是这两种类型的消息,会过滤出来丢弃。¤

2)存活消息过滤器。过滤出类型为GossipMessage_AliveMsg、GossipMessage_MemReq和GossipMessage_MemRes的消息。

3)状态消息过滤器。过滤出状态同步消息。

4)远程状态消息过滤器。过滤出GossipMessage_StateRequest和 GossipMessage_StateResponse的消息,这两种消息是为了状态同步而主动发送和接收的消息。如果它包含了连接验证信息,则会调用 MCS验证是否是指定通道成员发送的消息。

5)主节点选举消息过滤器。过滤出某个通道上的GossipMessage_LeadershipMsg消息。

我们来看看Gossip模块中的多路分用消息过滤器漏斗,如图4-2所示。

节点的Gossip模块会绑定gRPC端口(默认是7051端口),从其他节点或者排序服务节点上获取到的消息, 通过handler调用DeMultiplex实现消息的多路分用,消息会通过消息过滤器过滤后进行业务逻辑的处理。这里的过滤器都虚线来表示,以说明同 一层的过滤器不是互斥的,就是说同一层的过滤器输入都是相同的,经过过滤器的输出会不同。如果经过多层过滤器的过滤,消息是在上一层过滤的基础上筛选出来 的。比如“状态数据过滤器”和“状态同步消息过滤器”的输入都是“状态消息过滤器”的输出,而“状态消息过滤器”的输入是gRPC消息过滤出的 Gossip消息。

4.10 消息的多路分用及分区 - 数据结构 - 机器学习

图4-2 多路分用消息过滤器漏斗

ChannelDeMultiplexer中的channels可以定义多个,同一个消息只要满足pre定义的过 滤条件,就会放到对应的ch里,所以可能不同的channel里有相同的消息。对于需要广播的消息,Gossip模块还实现了消息分区,同一个消息经过过 滤器过滤以后,只会出现在一个列表中。函数实现比较简单,代码如下:


func partitionMessages(pred common.MessageAcceptor, a
*proto. SignedGossipMessage) ([]*proto.SignedGossipMessage,
[]*proto.SignedGossipMessage) {
   s1 := []*proto.SignedGossipMessage{}
   s2 := []*proto.SignedGossipMessage{}
   for _, m := range a {
       if pred(m) {
           s1 = append(s1, m)
       } else {
           s2 = append(s2, m)
       }
   }
   return s1, s2
}


经过partitionMessages处理过的消息a,会分成两个切片,满足过滤器pre的放到切片s1中,不满足的放到切片s2中。

广播消息过滤器有以下几种:

·区块数据过滤器:过滤出指定通道chainID的区块数据。

·状态消息过滤器:过滤出状态同步消息。

·通道内部的消息过滤器:过滤出只在通道内部广播的消息。

·组织内部的消息过滤器:过滤出只在组织内部广播的消息。

·主节点选举消息过滤器:过滤出某个通道上的GossipMessage_LeadershipMsg消息。

图4-3所示为分区消息过滤器漏斗。

4.10 消息的多路分用及分区 - 数据结构 - 机器学习

图4-3 分区消息过滤器漏斗

和消息多路分用不同,经过分区以后消息只能在一个结果集中,同一层的过滤器是互斥的。比如经过“区块数据过滤器”过滤以后,“状态消息过滤器”等就只能在其他消息中进行筛选。


来源:我是码农,转载请保留出处和链接!

本文链接:http://www.54manong.com/?id=1072

(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646208", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646147", container: s }); })();
window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdPic":"","bdStyle":"0","bdSize":"16"},"share":{},"image":{"viewList":["qzone","tsina","tqq","renren","weixin"],"viewText":"分享到:","viewSize":"16"},"selectShare":{"bdContainerClass":null,"bdSelectMiniList":["qzone","tsina","tqq","renren","weixin"]}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];
区块链是什么  

微信号:qq444848023    QQ号:444848023

加入【我是码农】QQ群:864689844(加群验证:我是码农)

<< 上一篇 下一篇 >>
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646186", container: s }); })();
(function() { var s = "_" + Math.random().toString(36).slice(2); document.write('
'); (window.slotbydup = window.slotbydup || []).push({ id: "u3646175", container: s }); })();
搜索

网站分类

标签列表

最近发表

    (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https'){ bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else{ bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();

全站首页 | 数据结构 | 区块链| 大数据 | 机器学习 | 物联网和云计算 | 面试笔试

var cnzz_protocol = (("https:" == document.location.protocol) ? "https://" : "http://");document.write(unescape("%3Cspan id='cnzz_stat_icon_1276413723'%3E%3C/span%3E%3Cscript src='" + cnzz_protocol + "s23.cnzz.com/z_stat.php%3Fid%3D1276413723%26show%3Dpic1' type='text/javascript'%3E%3C/script%3E"));本站资源大部分来自互联网,版权归原作者所有!

jQuery(document).ready(function($){ /* prepend menu icon */ $('#daohangs-around').prepend('
'); /* toggle nav */ $("#caidan-tubiao").on("click", function(){ $("#daohangs").slideToggle(); $(this).toggleClass("active"); }); });

©著作权归作者所有:来自ZhiKuGroup博客作者没文化的原创作品,如需转载,请注明出处,否则将追究法律责任 来源:ZhiKuGroup博客,欢迎分享。

评论专区
  • 昵 称必填
  • 邮 箱选填
  • 网 址选填
◎已有 0 人评论
搜索
作者介绍
30天热门
×
×
本站会员尊享VIP特权,现在就加入我们吧!登录注册×
»
会员登录
新用户注册
×
会员注册
已有账号登录
×