笔者之前曾经对当下的Message Queue解决方案做过一次详细分析,从OpenStack中用到的RabbitMQ,到Java平台的ActviceMQ,还有Apache Qpid 以及性能奇葩的ZeroMQ,最后还有不算MQ 而应该归为协议的MQTT。在那篇"Message Queue对比"中,我们可以发现消息队列各有各的使用场合,即使是大数据中常用的Kafak 以及Amazon SQS消息云服务,也各有自己的弊端,详细的情况这里不细说了,在图1有个大致的对比,有兴趣的还可以看看Message Queue一文。今天我们要介绍的是一家MQ服务平台PubNub(http://www.pubnub.com)
图1
为何要对这家公司的产品感兴趣了,因为感觉它将Zeromq的快速和RabbitMQ的持久化和高容错性做到了极致。以致我们可以从该官方网站上看到Amazon自己都将PubNub作为消息服务平台来使用,而不是使用自己的SQS
当然,我关注的主要因素还在于PubNub对IoT业务的支持。我们知道在IoT生态链条中,数据是价值的来源,那这些数据如何传到后端的云上,以及如何在分布式的云环境下做到信息的共享,都离不了类似PubNub这种提供消息传送的服务。PubNub在全球有14个数据中心,在世界范围内的同步可以做到延时控制在1/4秒内,支持每秒300万条消息。
尤其让我眼前一亮的是支持一段时间内历史信息的保存和回放,这样利于device设备失联后再次上线不会丢失信息,有点像手机短信。还有安全方面做的也很到位,从网络传输层的TLS 到消息内容的AES加密 再到PAM访问控制管理,三个层次对传送的信息进行保护。说了这么多,就让我们来看看PubNub的一个应用吧
关心科技发展的同学可能听到过Snapchat的名头,公司的中文名叫阅后即焚,这个可能很多人都知道。它的市值14年超过了100亿美元,就是允许用户拍照、录制视频、添加文字和图画,发送给自己在该应用上的好友。该文件在打开后,只有10秒钟寿命,随后便自动删除。这种功能借助PubNub很容易做到。
我们看PubNub上的一个开源Demo "Babel",它提供了聊天消息的5分钟自动销毁功能,当然这个时间你可以自己改,而且提供了指定用户间的通信,只有拥有公钥的对象才能看到加密的消息。Demo界面如下图
分5个步骤
1) 创建PubNub account,会得到一组跟account绑定的publish_key
和
subscribe_key,这个是发送和接受消息时需要用到的,比如一个room chat,大家都用同一个频道或帐号进行交流,
publish_key
和
subscribe_key
就相当于这个频道帐号
<script src="http://cdn.pubnub.com/pubnub.min.js"></script>
var pubnub = PUBNUB.init({
publish_key: 'demo',
subscribe_key: 'demo',
uuid: username,
ssl: username
});
2) 交换公钥Public key
利用PubNub的Presence方法进行用户间派发公钥
因为PubNub Presence允许用户查看谁在线和谁离线并保持实时更新用户的登录和退出情况。这样一个用户一旦订阅(Subscribe)到一条信道(channel),其他用户将能够通过
Presence看到它在PubNub上的状态,具体实现是用pubnub.here_now(),可以得到所有订阅某个channel的用户状态。这样用户订阅时,将username和公钥配对作为状态信息
发布。随后当需要用时就能通过pubnub.here_now()查到公钥,如下图 我们创建一个帐号wallace,公钥 123456abc,注意demo没有加密,实际中我们可以基于
3) 发送基于2048-bit TLS 的加密信息
用到一个
OnMessage() 处理接受信息
var RSAkey = cryptico.generateRSAKey(1024);
var publicKey = cryptico.publicKeyString(RSAkey);
pubnub.subscribe({
channel: 'encrypted_messaging',
callback: onMessage,
presence: presenceHandler,
state: {
username: 'wallace',
publicKey: publicKey
}
});
var sendMessage = function (recipient, message) {
if (recipient in users) {
var recipient_key = users[recipient];
message = cryptico.encrypt(message, recipient_key);
pubnub.publish({
channel: 'encrypted_messaging',
message: {
encryption: true,
recipient: recipient,
sender: username,
message: message
}
});
}else if (recipient === "Don't encrypt messages.") {
pubnub.publish({
channel: 'encrypted_messaging',
message: {
encryption: false,
recipient: "<strong>EVERYONE</strong>",
sender: username,
message: message
}
});
};
var onMessage = function (msg) {
if (msg.recipient === 'wallace') {
var text = msg.message;
if (msg.encryption) {
text = text.cipher;
var plaintext = cryptico.decrypt(text, RSAkey);
console.log(msg.sender + ' sent us this encrypted message!');
console.log(plaintext);
if (text.status === "failure") {
text = "Could not decrypt";
} else {
text = text.plaintext;
}
}else{
console.log(msg.sender + ' sent us this plain message!');
console.log(text);
}
}
}
4)消息的自我销毁
通过设置
var onMessage = function (m) {
mID++;
var msgID = mID;
$("#messages").prepend("<tr id='" + msgID + "'><td>" + m.sender + "</td><td>" + m.recipient + "</td><td>" + m.message + "</td><td id='" + msgID + "ttl'>" + m.ttl + "</tr>");
var updateTTL = setInterval(function () {
var ttl = $("#" + msgID + "ttl").text();
if (parseInt(ttl) <= 0) {
explode($("#" + msgID));
$("#" + msgID).remove();
clearInterval(updateTTL);
} else {
$("#" + msgID + "ttl").text(ttl - 1);
}
}, 1000);
};
5. Demo UI 设计
用JavaScript 和CSS
Insteon已经使用PubNub来实时控制智能家居,用于Insteon Web跟Hub和手机app之间消息的通信。用户可以通过简单的按键操作来控制所有跟INSTEON技术兼容的设备。pubnub增加了客户配置的便利性,允许用户将自己的产品与防火墙和防病毒解决方案无缝地结合在一起工作。
我个人认为,如果融合前期的The Thing System平台和PubNub平台,可以创造出更好地基于Web的IoT解决方案,这也是我后面研究的方向。
个人介绍:
Samsung Electronics VD IoT Platform高级工程师,在物联网,云计算,移动通讯,网络安全和消息传递基础构架领域拥有超过9年的专业知识和经验。拥有丰富的企业消息传递基础构架开发,物联网、云、设备联接解决方案开发,以及成熟的管理软件和解决方案,如敏捷和DevOpts的开发经验。在国内首次提出SDT(softwaredefined Things)的IOT概念,拥有3项专利(一份正在评审)。
是三星、英特尔、戴尔所成立智能家居设备标准联盟开放互联联盟(OIC)的代码贡献者(https://gerrit.iotivity.org/gerrit/p/iotivity.git)
https://www.iotivity.org/documentation/iotivity-services/protocol-plug-manager
经常参与云计算,物联网等开源社区(Vmware,ECUG失效云计算用户组)交流讨论,关注开源社区技术动态