Moquette 0.12(以下简称M12)的订阅树实现在moquette-0.12/broker/src/main/java/io/moquette/broker/subscriptions,包括:
订阅树版本 | M10 | M12 |
---|---|---|
订阅树增删改查 | SubscriptionDirectory | CTrieSubscriptionDirectory |
订阅树 | - | CTrie |
片段 | Token | Token |
主题 | Topic | Topic |
订阅信息 | Subscription | Subscription |
普通节点 | TreeNode | CNode |
封装节点 | - | INode |
墓碑节点 | - | TNode |
查看源码的时候应该从CTrie开始阅读。
Moquette 0.10(以下简称M10)的订阅树实现在moquette-0.10/broker/src/main/java/io/moquette/spi/impl/subscriptions,包括:
查看源码的时候应该从SubscriptionsDirectory开始阅读。
百度IoT的Broker设计我特别想参考的但是技术能力和时间不够去实现……网上只有一篇百度工程师的总结《共享行业的分布式MQTT设计》,这里将围绕这篇文章去讲解。
单机版MQTT Broker有连接数量和并发处理能力的限制,因此分布式必不可少。百度IoT采用的Akka Cluster来做集群管理,每个节点对等,不存在像Mosquitto这种用一台机器“桥接”做分布式产生的单点故障隐患。每个节点监听MemberUp、MemberDown、MemberUnreachable、ClusterMemberState等事件来感知其他节点的上下线,用Akka Actor实现节点间的消息通信。
一致性Hash是分布式架构最重要最基础的东西,这里以分布式图片缓存服务器为例进行讲述。
原始问题:假设我们需要对一堆图片做缓存,缓存的图片放在了2台服务器上,当到来一个请求,应该如何知道请求的图片在哪台上面呢?
暴力遍历就不要去想了,否则缓存就没有意义了。一个自然的想法就是根据图片的名字做一个映射(Hash),将图片名字映射到0,1两个数字上面,例如有这样的映射函数:
$$ f(图片名称) = md5(图片名称) \% 2 $$
局部二值模式(Local Binary Pattern,LBP)是一种用来描述图像局部纹理特征的算法,反映的是图像像素点周围纹理变化情况,具有旋转不变性、灰度不变性(光照变化无影响)、计算复杂度低等优点,1994年首次由Timo Ojala, Matti Pietikainen等人提出,用于纹理特征提取。2002年论文《Multiresolution gray-scale and rotation invariant texture classification with local binary patterns》进行了归纳总结,2018年该论文引用量154次,累计9832次。
Haar特征是我用得最多的一个特征了。Haar特征的鲁棒性并不好,它常常用于颜色或者轮廓较为明显的、波动不大的图像,比如人脸识别中识别眼睛、鼻子的位置。尽管如此,用Haar特征处理一般图像分割已经足够使用了。
Haar特征(Haar-like Feature)的名称来源于Haar小波(Haar Wavelet)变换,最早由Papageorgiou在论文《A General Framework for Object Detection》中提出。那个时期,用RGB图像像素值来处理特征会产生很大的计算量,Papageorgiou等人就提出了用Haar小波变换来处理特征的想法。在2001年,Viola和Jones在论文《Rapid Object Detection using a Boosted Cascade of Simple Features》中基于这个想法进一步提出Haar特征,产生了很大的影响。他们注意到人的面部是可以用一些矩形特征进行描述的,比如对于浅色皮肤的人来说,鼻梁两侧的颜色比鼻梁的颜色要深一些,眼睛、嘴巴等地方的颜色都比周围面部皮肤的颜色要深。因此,可以用矩形像素变化来表现颜色深浅,这就是Haar特征的来源。
入门彩色图像分割首先当然要了解一下颜色空间。
RGB颜色空间的设计初衷是,用红色(Red)、蓝色(Blue)和绿色(Green)作为基础颜色,通过三基色的强弱变化组合成整个颜色空间中的各种颜色。
如上图所示,分别以红色、绿色、蓝色分量为R轴、G轴、B轴建立坐标系,原点(0, 0, 0)代表的颜色为黑色,(1, 0, 0)、(0, 1, 0)、(0, 0, 1)分别表示红色、蓝色、绿色,构成的立方体中体对角线端点(1, 1, 1)代表的颜色为白色,而体对角线上的颜色则是由黑色过渡到白色的灰度。至此,任意一种常见颜色都可以由(R, G, B)的坐标数值表示出来。
这是本科毕设用到的树,概率提升树(Probabilistic Boosting-Tree, PBT)是Tu在2005年《Probabilistic Boosting-Tree: Learning Discriminative Models for Classification, Recognition, and Clustering》中提到的分层分类框架。