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.