Make mosquitto works better.
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
client
doc/historical
examples
installer
lib
logo
man
misc/currentcost
security
service
src
test
.gitignore
CMakeLists.txt
ChangeLog.txt
LICENSE-3rd-party.txt
LICENSE.txt
README.md
THANKS.txt
aclfile.example
changeset
cmake_install.cmake
compiling.txt
config.h
config.mk
mosquitto.conf
pskfile.example
pwfile.example
readme-windows.txt
readme.txt

README.md

better-mosquitto

Because there are several design in mosquitto are not good enough, so i decide to change it as to train my c.

Feature

TODO

  • custom event loop
  • better datastructure
  • persist/backup
  • signal handling
  • a web interface based on go(and self web framework)

log

  • 2014.3.31 add libevent support done
  • 2014.3.30 try to add libevent support
  • 2014.3.27 add kqueue support

架构

旧的逻辑,但就消息处理的角度来看,基本上是依靠select的轮训。

  • step1 问一次所有监听的socket,有没内容可以处理。
  • step2,问完后,就把发过来的消息塞订阅了对应话题的客户端自己维护的队列里面。
  • step3,轮训每个客户端,把他们消息队列上面的消息发送出去。然后又来一次新的select轮训。

总的来说,整个程序都是串行起来运行的,逻辑较简单。

[    ] ----->client
    \
     \  --->pub
      \
    [                ]  ---->lots of listen sockets      *step1
      \     \      \
        \     \     \
       [  ]   [  ]   [  ]   --->contexts->msgs array    *step2

             ****              *step3

Known Weakness

  • select event loop
  • most data structure is linked list
    • cost O(n)
  • 内存分配策略简单,来一个生成一个,存在优化空间。
    • 比如改用初始2倍,到达一定数量后,以后每次改用增加额定数量的算法
  • 内存占用过大
    • 没有使用数据库,数据都堆在内存里面,可能无法应付大数据量
  • 改为单线程版本,降低锁开销,目前锁开销还是非常大的。目测可以改为单进程版本,类似redis,精心维护的话应该能达到不错的效果
  • 网络数据读写使用一次尽量多读的方式,避免多次进入系统调用;
  • 内存操作优化。不free,留着下次用;
  • 考虑使用spwan-fcgi的形式或者内置一次启动多个实例监听同一个端口。这样能更好的发挥机器性能,达到更高的性能;