About这个网站[置顶]
如果想做一件事情,现在就是个不错的时间
为什么要搭这个网站
从本科开始就想做一个网站,但是一直都不知道做什么主题的,于是便一直拖啊拖。中间也确实搭建了数个博客性质的网站,但是往往自己在搭建好之后就在意淫网站该怎么优化啊,怎么做才能抵抗高并发啊...结果每次都因为想太多到最后还是一事无成,在这些浮夸而不切实际的思考中浪费了许许多多的时间,而那些网站却一个个的关闭,因为自己也不知道自己要做什么。
如果想做一件事情,现在就是个不错的时间
从本科开始就想做一个网站,但是一直都不知道做什么主题的,于是便一直拖啊拖。中间也确实搭建了数个博客性质的网站,但是往往自己在搭建好之后就在意淫网站该怎么优化啊,怎么做才能抵抗高并发啊...结果每次都因为想太多到最后还是一事无成,在这些浮夸而不切实际的思考中浪费了许许多多的时间,而那些网站却一个个的关闭,因为自己也不知道自己要做什么。
本文主要介绍一下Mosquitto中用到的比较重要的数据结构,为之后的流程处理讲解奠定基础。为了清晰,结构体展示时只保留重要成员。
struct mosquitto_db{
/*主题树的根结点*/
struct _mosquitto_subhier subs;
/*id:context映射的Hash表首节点,通过该成员去遍历Hash表*/
struct mosquitto *contexts_by_id;
/*sock:context映射的Hash表首节点,通过该成员去遍历Hash表*/
struct mosquitto *contexts_by_sock;
/*存储消息的链表*/
struct mosquitto_msg_store *msg_store;
/*服务器的配置*/
struct mqtt3_config *config;
/*由于断开连接等需要释放的context存放的链表*/
struct mosquitto *ll_for_free;
};
mosquitto_db可谓是mosquitto最核心的结构体,没有之一。它维护着服务器配置、主题树、客户端句柄、接收的消息列表。其中为了查找方便,建立了通过客户端id来查找客户端句柄的Hash表和通过客户端socket连接描述符查找客户端句柄的Hash表;将连接断开的客户端句柄先存放在ll_for_free链表中,待到合适时统一释放。
写这个系列文章其实出发点有很多。一方面是很早之前看到了一个开源物联网云平台项目,叫做iotgo,有兴趣的同学可以去搜索后了解一下。iotgo使用的是node.js语言编写,是一个物理网设备管理的平台。我抽出了十一假期研究了一下它的源码:它使用angular做前端,前端通过websocket实时从后台获取设备信息,所有的设备通过socket与平台通讯。但是这个框架我还是觉得很别扭,可能在我看来一个网站只是一个用户接口而已,不应与设备直接打交道,于是我想起来了MQTT(只是一个协议),当时实验室有同学在用这个做项目。设备可以通过MQTT协议与服务器进行通信,然后网站只需要与代理服务器进行交互信息。目前开源的MQTT服务器众多,但性能参差不齐,比较常用的是Mosquitto,EMQTT等等。Mosquitto被广泛地应用在各种研究和实际项目,但在阅读其源码的过程中,发现它还有很多性能可以提升的地方。所以提升MQTT服务器性能成了我的毕业设计,我想将自己理解和修改Mosquitto过程记录下来分享出来,这些是我写这系列文件的初衷之一。
Eclipse Mosquitto™ is an open source (EPL/EDL licensed) message broker that implements the MQTT protocol versions 3.1 and 3.1.1. MQTT provides a lightweight method of carrying out messaging using a publish/subscribe model. This makes it suitable for "Internet of Things" messaging such as with low power sensors or mobile devices such as phones, embedded computers or microcontrollers like the Arduino.
MQTT协议的固定报文头由两个部分组成,第一部分是报文的控制类型与标识,占据1个字节;第二部分是报文的剩余长度,占据1~4个字节。
控制标识共占一个字节,位于MQTT报文的第1个字节。其中高4位是控制报文类型,低4位是控制标识,如下。
心跳检测是客户端发送给服务端的。协议中关于心跳检测的作用是这样叙述的
1.在没有任何其它控制报文从客户端发给服务的时,告知服务端客户端还活着。
2.请求服务端发送 响应确认它还活着。
3.使用网络以确认网络连接没有断开。

发布可以使客户端发送给服务端,也可以是服务端发送给客户端。当一个客户端A想发布一条消息时,它应该先把这条消息发布给服务端,然后由服务端作为代理将该条消息发布给所有订阅消息主题的客户端们。

Apollo是一款由Apache研发的一款MQTT broker。借用官方的介绍:ActiveMQ Apollo is a faster, more reliable, easier to maintain messaging broker built from the foundations of the original ActiveMQ. It accomplishes this using a radically different threading and message dispatching architecture. Like ActiveMQ, Apollo is a multi-protocol broker and supports STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets.
这里不多说,网上有很多安装了配置JAVA运行环境的教程,有一点需要注意的是,要下载JDK,因为单独的JRE包里是没有bin/server/jvm.dll。