Licensed under the Apache License, Version 2.0 Now.
Improve the design of cluster, support to join or leave the cluster (#449):
$ ./bin/emqttd_ctl cluster
cluster join <Node> #Join the cluster
cluster leave #Leave the cluster
cluster remove <Node> #Remove the node from cluster
cluster status #Cluster status
Improve the design of Trie and Route, only the wildcard topics stored in Trie.
Common Test to replace EUnit.
mqtt_message record: add 'sender' field (#440)
refactor the emqttd, emqttd_time, emqttd_opts, emqttd_node modules.
noproc error when call to gen_server2:call(false, {add_route,Topic,<0.685.0>}, infinity) (#446)
Changed the license of all plugins.
Optimize for Push Application, 500K+ Subscribers to a Topic.
Optimization for Route ETS insertion (#427)
Priority Message Queue for Persistent Session (#432)
Add Redis, MongoDB Plugins (#417)
Username/Password Authentication: Support to configure default users (#428)
Improve CLI Commands: pubsub, bridges, trace (#429)
emqttd_mod_subscription: fix client_connected/3
emqttd_auth_mod: add passwd_hash/2 function
priority_queue: add plen/2, out/2 functions
Fix dequeue/1 of emqttd_bridge...
Add emqttd:seed_now/0 function
emqttd_plubin_mysql: Changed mysql driver to mysql-otp
emqttd_plugin_pgsql: Integrate with ecpool
emqttd_plugin_redis: First release
emqttd_plugin_mongo: First release
Bugfix: emqttd_ws_client.erl: Unexpected Info: {'EXIT',<0.27792.18>,{shutdown,destroy}} (#413)
Improve: fix spec errors found by dialyzer
Scaling to 1.3 Million Concurrent MQTT Connections on a 12 Core, 32G CentOS server.
New PubSub, Router Design (#402). Prepare for scaling to 10 millions on one cluster.
Improve the gproc_pool usage with a general emqttd_pool_sup
Improve the design of emqttd_pubsub, add a new emqttd_router module
Improve the design of the whole supervisor tree
Route aging mechanism to remove the topics that have no subscriptions
Improve the dashboard, mysql, pgsql, stomp, sockjs plugins
Add 'topics', 'subscriptions' admin commands
Avoid using mnesia table index and mnesia:index_read API to lower CPU usage
Subscribe timeout exception (#366)
Long Delay on Multiple Topic Subscription (#365)
Subscriptions persistence (#344)
emqttd_ctl: 'subscriptions' command to force clients to subscribe some topics (#361)
emqttd_sm: spec of lookup_session/1 is not right BUG (#411)
Observer application should be removed from reltool.config for 'wx' app is not available (#410)
1.3 million concurrent MQTT connections on a 12 Core, 32G CentOS Server, consume about 15G Memory and 200% CPU.
Bugfix: Plugin pathes error under windows (#387)
Improve: Too many error logs "[error] Session ..... Unexpected EXIT: client_pid=<0.14137.35>, exit_pid=<0.30829.22>, reason=nop..." (#383)
Improve: Define QOS0/1/2, Pooler Error (PR#382)
Improve: High CPU load when 400K unstable mobile connections (#377)
BugFix: emqttd_plugin_pgsql - error using same query with latest update plugin (pgsql#5)
Rate Limiting based on Token Bucket and Leaky Bucket Algorithm
Upgrade eSockd and MochiWeb libraries to support Parameterized Connection Module
Improve emqttd_client to support fully asynchronous socket networking
Protocol Compliant - Session Present Flag (#163)
Compilation fails if repo is cloned with a different name (#348)
emqttd_client: replace gen_tcp:send with port_command (#358)
TCP sndbuf, recbuf, buffer tuning (#359)
emqttd_client.erl to handle 'inet_async', 'inet_reply' properly (#360)
Refator the client/session management design
Cannot kick transient client out when clientId collision (#357)
Fix the order of emqttd_app:start_server/1 (#367)
emqttd_session:subscribe/2 will crash (#374)
3.1G memory and 50+ CPU/core:
Connections: 250K
Subscribers: 250K
Topics: 50K
Qos1 Messages/Sec In: 4K
Qos1 Messages/Sec Out: 20K
Traffic In(bps): 12M+
Traffic Out(bps): 56M+
Bugfix: emqttd_sysmon crasher for 'undefined' process_info (#350)
Bugfix: emqttd_client: catch parser exception (#353)
Bugfix: Retained messages should not be expired if 'broker.retained.expired_after = 0' (#346)
Highlight: Release for Bugfix and Code Refactor.
Feature: Retained message expiration (#182)
Improve: '$SYS/#' publish will not match '#' or '+/#' (#68)
Improve: Add more metrics and ignore '$SYS/#' publish (#266)
Improve: emqttd_sm should be optimized for clustered nodes may be crashed (#282)
Improve: Refactor emqttd_sysmon and suppress 'monitor' messages (#328)
Task: benchmark for 0.12.0 release (#225)
Benchmark: About 900K concurrent connections established on a 20Core, 32G CentOS server.
Enhance the emqttd_ctl module to allow plugins to register new commands (#256)
Add emqttd_recon plugin to debug/optimize the broker (#235)
Add './bin/emqttd_ctl broker pubsub' command to check the status of core pubsub processes
Add './bin/emqttd_top' command(like etop) to show the top 'msg_q', 'reductions', 'memory' or 'runtime' processes
'rel/files/emqttd.config.production' for production deployment(default)
'rel/files/emqttd.config.development' for development deployment
Qos1/2 messages will not be dropped under unstable mobile network (#264)
emqttd_session:subscribe/2, emqttd_session:unsubscribe/2 APIs should be asynchronous (#292)
etc/emqttd.config: 'idle_timeout' option to close the idle client(socket connected but no 'CONNECT' frame received)
etc/emqttd.config: 'unack_retry_interval' option for redelivering Qos1/2 messages
How to monitor large 'message_queue_len' (#283)
Behaviour emqttd_auth_mod is missing init callback (#318)
Write a new benchmark tool to benchmark this release
Hw requirements - 5K users, 25-50 msgs/sec, QoS=1 (#209)
Supported Number of Connections Greatly Reduced When Clients are Subscribing (#324)
Highlight: Rebar to manage plugin dependencies.
Highlight: Stomp and SockJS Plugins!
Improve: add rel/files/emqttd.config.development|production.
Improve: rel/reltool.config.script to release deps of plugin.
Improve: persist mnesia schema on slave nodes.
Improve: use timer:seconds/1 api.
Improve: The binary release will be compiled with R18.1 now.
Bugfix: issue#306 - emqttd_cm should unregister the duplicated client
Bugfix: issue#310 - usage of emqttd_ctl error: 'session list' should be 'sessions list'
Bugfix: issue#311 - './bin/emqttd_ctl sessions list' error
Bugfix: issue#312 - unsubcribe will lead to crash if emqttd_plugin_template plugin loaded
Optimize session management and upgrade eSockd library to 2.7.1
Improve: issue#294 - [error] failed to start connection on 0.0.0.0:1883 - enotconn
Improve: issue#297 - How do I allow user with some pattern to access topic with some pattern?
Bugfix: issue#291 - "./bin/emqttd attach ..." cannot work
Bugfix: issue#284 - Should not use erlang:list_to_atom/1 in emqttd_vm.erl
Bugfix: issue#271 - add emqttd_ws_client:subscribe/2 function
Bugfix: issue#269 - bin/emqttd Syntax error on ubuntu
Improve: issue#265 - client under unstable mobile network generate a lot of logs
Improve: issue#257 - After the node name changed, the broker cannot restart for mnesia schema error.
Bugfix: issue#259 - when clustered the emqttd_dashboard port is close, and the 'emqttd' application cannot stop normally.
Feature: issue#262 - Add 'http://host:8083/mqtt/status' Page for health check
Web Dashboard and MySQL, PostgreSQL Authentication/ACL Plugins!
Highlight: Web Dashboard to monitor Statistics, Metrics, Clients, Sessions and Topics of the broker.
Highlight: JSON/HTTP API to query all clients connected to broker.
Highlight: A new Plugin Design and a Template project for plugin development.
Highlight: Authentication/ACL with MySQL, PostreSQl databases (#194, #172)
Feature: Session Statistics including inflight_queue, message_queue, message_dropped, awaiting_rel, awaiting_ack, awaiting_comp (#213)
Feature: Cookie based authentication for MQTT over websocket connections (#231)
Feature: Get all clients connected to the broker (#228, #230, #148, #129)
Feature: "./bin/emqttd_ctl clients show ClientId" to query client status (#226)
Feature: "./bin/emqttd_ctl clients kick ClientId" to kick out a client
Feature: "./bin/emqttd_ctl sessions list" to show all sessions
Feature: "./bin/emqttd_ctl sessions show ClientId" to show a session
Feature: Erlang VM metrics monitor with Web Dashboard (#59)
Improve: Too many "inflight queue is full!" log when session is overloaded (#247)
Improve: There are two many "MQueue(~s) drop ~s" logs if the message queue of session is small (#244)
Improve: gen_server2(from RabbitMQ) to improve emqttd_session, emqttd_pubsub
Improve: Makefile to build plugins
Bugfix: emqttd_broker:unhook/2 cannot work (#238)
Bugfix: emqttd plugin cannot include_lib("emqttd/include/emqttd.hrl") (#233)
Bugfix: Too many 'Session ~s cannot find PUBACK' logs (#212)
Bugfix: emqttd_pooler cannot work
Wiki: Bridge
Improve: emqttd_protocol.hrl to define 'QOS_I'
Improve: emqttd_pubsub to add subscribe/2 API
Improve: ./bin/emqttd_ctl to support new bridges command
Bugfix: issue #206 - Cannot bridge two nodes
Improve: issue #196 - Add New Hook 'client.subscribe.after'
Bugfix: issue #189 - MQTT over WebSocket(SSL) cannot work?
Bugfix: issue #193 - 'client.ack' hook should be renamed to 'message.acked', and called by emqttd_broker:foreach_hooks
Session, Queue, Inflight Window, Hooks, Global MessageId and More Protocol Compliant Now!
Feature: Session/Queue/Inflight Window Design (#145).
Feature: Support to resume a persistent session on other clustered node.
Feature: Support alarm management.
Feature: emqttd_guid to generate global unique message id.
Feature: Hooks for message pub/ack.
Feature: Protocol compliant - message ordering, timeout and retry.
Improve: Every client will start_link a session process, whether or not the client is persistent.
Improve: etc/emqttd.config to support more session, queue configuration.
Improve: issue #179 - Max offline message queue {max_queue, 100} meaning.
Improve: issue #180 - Should change project structure for other projects maybe depend on 'emqttd'. Merge emqtt, emqttd apps.
Improve: issue #185 - PacketId and MessageId: the broker should generate global unique message id.
Improve: issue #187 - etc/emqttd.config to support https listener
Improve: issue #186 - emqttd_cm to store client details
Improve: issue #174 - add 'from' field to mqtt_message record.
Improve: issue #170 - $SYS Topics should support alarms.
Improve: issue #169 - Add More Hooks
Improve: issue #167 - Inflight window to assure message ordering.
Improve: issue #166 - Message delivery timeout and retry.
Improve: issue #143 - Qos1, Qos2 PubSub message timeout.
Improve: issue #122 - Labeling message with unique id. emqttd_guid module to generate global unique msgid.
Improve: emqttd_bridge to support pending message queue, and fix the wrong Qos design.
Improve: mqtt_message record to add 'msgid', 'from' and 'sys' fields.
Change: Add emqttd_mqueue, emqttd_guid, emqttd_alarm modules.
Bugfix: issue #184 - emqttd_stats:setstats is not right.
Bugfix: Closed issues #181, #119.
Tests: fix the parser, acl test cases.
Bugfix: issue #175 - publish Will message when websocket is closed without 'DISCONNECT' packet
Bugfix: issue #53 - client will receive duplicate messages when overlapping subscription
Bugfix: issue #165 - duplicated message when publish 'retained' message to persistent client
Bugfix: issue #158 - should queue:in new message after old one dropped
Bugfix: issue #155 - emqtt_parser.erl: parse_topics/3 should reverse topics
Bugfix: issue #149 - Forget to merge plugins/emqttd_auth_mysql from 'dev' branch to 'master' in 0.8.x release
Bugfix: issue #147 - WebSocket client cannot subscribe queue '$Q/queue/${clientId}'
Bugfix: issue #146 - emqttd_auth_ldap: fill(Username, UserDn) is not right
Client Presence Support and $SYS Topics Redesigned!
Bugfix: issue #138 - when client disconnected normally, broker will not publish disconnected $SYS message
Bugfix: fix websocket url in emqttd/priv/www/websocket.html
Improve: etc/emqttd.config to allow websocket connections from any hosts
Improve: rel/reltool.config to exclude unnecessary apps.
Hooks, Modules and Plugins to extend the broker Now!
Plugin: emqttd_auth_mysql - MySQL authentication plugin (issues #116, #120)
Plugin: emqttd_auth_ldap - LDAP authentication plugin
Feature: emqttd_broker to support Hooks API
Feature: issue #111 - Support 'Forced Subscriptions' by emqttd_mod_autosub module
Feature: issue #126 - Support 'Rewrite rules' by emqttd_mod_rewrite module
Improve: Support hooks, modules to extend the broker
Improve: issue #76 - dialyzer check
Improve: 'Get Started', 'User Guide', 'Developer Guide' Wiki
Improve: emqtt_topic to add join/1, feed_var/3, is_queue/1
Improve: emqttd_pooler to execute common tasks
Improve: add emqttd_sm_sup module, and use 'hash' gproc_pool to manage sessions
Tests: add more test cases for 'emqttd' app
Add doc/design/* and merge doc/* to github Wiki
Bugfix: issue #121 - emqttd cluster issuse
Bugfix: issue #123 - emqttd:unload_all_plugins/0 cannot unload any plugin
Bugfix: fix errors found by dialyzer
Plugin Achitecture based on OTP application
Trace MQTT Packets or Messages to log files
Feature: issue #40, #115 - WebSocket/SSL Support
Feature: issue #49, #105 - Plugin Architecture Support
Feature: issue #93 - Trace API Design
Improve: issue #109 - emqttd_broker should add subscribe, notify API
Improve: update README.md to add 'Goals', 'Contributors' chapters
Change: rename etc/app.config to etc/emqttd.config
Change: etc/emqttd.config changed
Bugfix: critical issue #54 - error when resume session!
Bugfix: issue #118 - error report when UNSUBSCRIBE with no topics
Bugfix: issue #117 - sys_interval = 0 config cannot work
Bugfix: issue #112 - Makefile to support build plugins
Bugfix: issue #96 - "make clean" cannot work
Bugfix: critical issue #54, #104, #106 - error when resume session
Improve: add emqttd_cm_sup module, and use 'hash' gproc_pool to register/unregister client ids
Improve: kick old client out when session is duplicated.
Improve: move mnesia dir config from etc/app.config to etc/vm.args
Integrate with gproc library to support pool
Feature: issues#91 - should use worker_pool to handle some async work?
Feature: issues#95 - Topic filters in ACL rule should support 'eq' tag
Improve: issues#84 - emqttd_pubsub is redesigned again to protect mnesia transaction
Improve: issues#74 - ACL Support and update ACL Design Wiki
ACL Support Now: ACL-Design Wiki
Authentication with username, clientid Now: Authentication Wiki
Seperate common MQTT library to 'emqtt' application
Redesign message pubsub, route and retain modules
Redesign mnesia database cluster
Feature: issues#47 - authentication, authorization support
Feature: issues#92 - merge emqttd_acl and emqttd_auth to emqttd_access_control
Feature: emqttd_acl_mod, emqttd_auth_mod behaviour to extend ACL, authentication
Feature: issues#85 - lager:info to log subscribe, unsubscribe actions
Feature: issues#77 - authentication with clientid, ipaddress
Improve: issues#90 - fix lager_file_backend log format, and rotate 10 log files
Improve: issues#88 - use '-mneisa_create', '-mnesia_replicate' attributes to init mneisa
Improve: issues#87 - record mqtt_user and mqtt_client is duplicated
Improve: issues#81 - redesign nodes cluster to support disc_copies mnesia tables
Improve: issues#80 - redesign emqttd_cm to handle more concurrent connections
Improve: issues#70 - how to handle connection flood? Now could support 2K+ CONNECT/sec
Change: redesign mnesia tables: message, topic, subscriber, trie, trie_node
Bugfix: issues#83 - emqttd_broker stats cannot work
Bugfix: issues#75 - careless about function name when emqttd_pubsub handle getstats message
Bugfix: issue #75 - careless about function name when emqttd_pubsub handle getstats message.
Bugfix: issue #79 - cannot find topic_subscriber table after cluster with other nodes.
Benchmark this release on a ubuntu/14.04 server with 8 cores, 32G memory from QingCloud.com:
200K Connections,
30K Messages/Sec,
20Mbps In/Out Traffic,
200K Topics,
200K Subscribers,
Consumed 7G memory, 40% CPU/core
Benchmark code: https://github.com/emqtt/emqttd_benchmark
Change: rewrite emqttd_pubsub to handle more concurrent subscribe requests.
Change: ./bin/emqttd_ctl add 'stats', 'metrics' commands.
Bugfix: issue #71, #72
Bugfix: issues#72 - emqttd_cm, emqtt_sm ets:match_delete/2 with wrong pattern
Change: upgrade esockd to 2.1.0-alpha, do not tune socket buffer for mqtt connection.
Change: upgrade esockd to v1.2.0-beta, rename 'acceptor_pool' to 'acceptors'
RENAME 'emqtt' to 'emqttd'!
Support Broker Bridge Now!
Change: rename project from 'emqtt' to 'emqttd'
Change: lager:debug to dump RECV/SENT packets
Feature: emqttd_bridg, emqttd_bridge_sup to support broker bridge
Feature: emqtt_event to publish client connected/disconnected message to $SYS topics
Feature: ./bin/emqttd_ctl add more commands: listeners, broker, bridges, start_bridge, stop_bridge...
Feature: issue#57 - support to configure max packet size
Feature: issue#68 - if sys_interval = 0, emqttd_broker will not publish messages to $SYS/brokers/#
Bugfix: issue#67 - subscribe '#' to receive all messages
Bugfix: issue#64 - emqtt_app start/2: should wait_for_databases
Test: emqttd_topic_tests add more '_match_test'
Support $SYS Topics of Broker Now!
Feature: emqtt_broker to publish version, uptime, datetime to $SYS/brokers/# topics
Feature: emqtt_broker to publish count of clients, sessions, suscribers to $SYS/brokers/# topics
Feature: emqtt_metrics to publish bytes, packets, messages metrics to $SYS/brokers/# topics
Feature: add include/emqtt_systop.hrl
Change: emqtt_cm to count current clients
Change: emqtt_sm to count current sessions
Change: emqtt_pubsub to count current topics and suscribers
Change: emqtt_pubsub to add create/1 API
Change: emqtt_pubsub dispatch/2 to return number of subscribers
Change: emqtt_pubsub to count 'dropped' messages
Change: emqtt_opts to add merge/2 function
Test: add emqtt_serialiser_tests.erl
Bugfix: emqtt_serialiser.erl cannot serialise UNSUBACK packets
Bugfix: emqtt_serialiser.erl cannot serialise PINGRESP issue#60
Improve: merge emqttc serialiser, parser, packet
Add: emqtt_opts to merge socket options
Feature: SSL Socket Support
Feature: issue#44 HTTP API should add Qos parameter
Bugfix: issue#52 emqtt_session crash
Bugfix: issue#53 sslsocket keepalive error
Upgrade: esockd to v0.2.0
Upgrade: mochiweb to v3.0.0
Feature: HTTP POST API to support 'qos', 'retain' parameters
Feature: $SYS system topics support
Change: Rewrite emqtt_topic.erl, use '', '#', '+' to replace <<"">>, <<"#">>, <<"+">>
Change: fix emqtt_pubsub.erl to match '#', '+'
Tests: emqtt_topic_tests.erl add more test cases
NOTICE: Full MQTT 3.1.1 support now!
Feature: Passed org.eclipse.paho.mqtt.testing/interoperability tests
Feature: Qos0, Qos1 and Qos2 publish and suscribe
Feature: session(clean_sess=false) management and offline messages
Feature: redeliver awaiting puback/pubrec messages(doc: Chapter 4.4)
Feature: retain messages, add emqtt_server module
Feature: MQTT 3.1.1 null client_id support
Bugfix: keepalive timeout to send will message
Improve: overlapping subscription support
Improve: add emqtt_packet:dump to dump packets
Test: passed org.eclipse.paho.mqtt.testing/interoperability
Test: simple cluster test
Closed Issues: #22, #24, #27, #28, #29, #30, #31, #32, #33, #34, #36, #37, #38, #39, #41, #42, #43
pull request 26: Use binaries for topic paths and fix wildcard topics
emqtt_pubsub.erl: fix wildcard topic match bug caused by binary topic in 0.2.0
Makefile: deps -> get-deps
rebar.config: fix mochiweb git url
tag emqtt release accoding to Semantic Versioning
max clientId length is 1024 now.
rewrite the project, integrate with esockd, mochiweb
support MQTT 3.1.1
support HTTP to publish message
Bugfix: remove QOS_1 match when handle PUBREL request
Bugfix: reverse word in emqtt_topic:words/1 function
Bugfix: fix "mosquitto_sub -q 2 ......" bug
Bugfix: fix keep alive bug
Feature: support QOS2 PUBREC, PUBREL,PUBCOMP messages
Bugfix: fix emqtt_frame to encode/decoe PUBREC/PUBREL messages
Feature: release support like riak
Bugfix: use ?INFO/?ERROR to print log in tcp_listener.erl
Feature: use rebar to generate release
Feature: support retained messages
Bugfix: send will msg when network error
The first public release.