±³¾°
Ëæ×ÅÒÆ¶¯»¥ÁªÍøÂýÂý½øÈëºó°ë³¡£¬Ô½À´Ô½¶àµÄ¹«Ë¾½«×¢ÒâÁ¦×ªÒƵ½ÎïÁªÍø£¬Ï£Íûͨ¹ýÔçÆÚ²¼¾ÖÀ´Æðµ½Õ¼ÁìÕâ¸öÐÐÒµµÄÖÆ¸ßµã£¬±ÈÈçĿǰÁ÷ÐеÄĦ°Ýµ¥³µ£¬OFO µ¥³µ¶¼ÊǵäÐ͵ÄÎïÁªÍøÓ¦Óá£ÎïÁªÍø±¾Éí²¢²»ÊÇʲôиÅÄî£¬Ëæ×Å´óÊý¾Ý£¬AI µÈ¼¼ÊõµÄ·¢Õ¹£¬´ó¼ÒÒâʶµ½´«Í³µÄÎïÁªÍøÍ¨¹ýÒ»¶¨¸ÄÔ죬½èÖú´óÊý¾ÝÒÔ¼° AI ¼¼Êõ¿ÉÒÔ»ñµÃºÜ¶à¶îÍâµÄ¼ÛÖµ¡£
ÕâÀïÖ÷Òª½éÉÜÎïÁªÍøµÄ½ÓÈë·þÎñ£¬ÎïÁªÍøÖ÷Á÷½ÓÈëÐÒé·ÖΪ MQTT£¬CoaP£¬Http£¬XMPPµÈ¼¸ÖÖ£¬±¾ÎÄÖ÷ÒªÊǽéÉÜ MQTT ÐÒéµÄÓÅȱµãÒÔ¼°ÈçºÎʵÏÖ MQTT µÄ·Ö²¼Ê½¿ò¼Ü£¬ÖÁÓÚ¸÷¸öÐÒéÖ®¼äµÄ±È½Ï¾Í²»ÔÙÕâÀïÏêϸ½éÉÜ£¬´ó¼Ò¿ÉÒÔ°Ù¶ÈÏà¹Ø×ÊÁÏÈ¥×öÏêϸÁ˽⡣
MQTT ÐÒéÖ÷ÒªÌØµã
MQTT ÐÒéÊÇΪ´óÁ¿¼ÆËãÄÜÁ¦ÓÐÏÞ£¬ÇÒ¹¤×÷Ôڵʹø¿í¡¢²»¿É¿¿µÄÍøÂçµÄÔ¶³Ì´«¸ÐÆ÷ºÍ¿ØÖÆÉ豸ͨѶ¶øÉè¼ÆµÄÐÒ飬Ëü¾ßÓÐÒÔÏÂÖ÷ÒªµÄ¼¸ÏîÌØÐÔ£º
- ʹÓ÷¢²¼ / ¶©ÔÄÏûϢģʽ£¬Ìṩһ¶Ô¶àµÄÏûÏ¢·¢²¼£¬½â³ýÓ¦ÓóÌÐòñîºÏ£»
- ¶Ô¸ºÔØÄÚÈÝÆÁ±ÎµÄÏûÏ¢´«Ê䣻
- ʹÓà TCP/IP Ìá¹©ÍøÂçÁ¬½Ó£»
- ÓÐÈýÖÖÏûÏ¢·¢²¼·þÎñÖÊÁ¿£º
¡°ÖÁ¶àÒ»´Î¡±£¬ÏûÏ¢·¢²¼ÍêÈ«ÒÀÀµµ×²ã TCP/IP ÍøÂç¡£»á·¢ÉúÏûÏ¢¶ªÊ§»òÖØ¸´¡£ÕâÒ»¼¶±ð¿ÉÓÃÓÚÈçÏÂÇé¿ö£¬»·¾³´«¸ÐÆ÷Êý¾Ý£¬¶ªÊ§Ò»´Î¼Ç¼ÎÞËùν£¬ÒòΪ²»¾Ãºó»¹»áÓеڶþ´Î·¢ËÍ¡£
¡°ÖÁÉÙÒ»´Î¡±£¬È·±£ÏûÏ¢µ½´ï£¬µ«ÏûÏ¢ÖØ¸´¿ÉÄܻᷢÉú¡£
¡°Ö»ÓÐÒ»´Î¡±£¬È·±£ÏûÏ¢µ½´ïÒ»´Î¡£ÕâÒ»¼¶±ð¿ÉÓÃÓÚÈçÏÂÇé¿ö£¬ÔڼƷÑϵͳÖУ¬ÏûÏ¢ÖØ¸´»ò¶ªÊ§»áµ¼Ö²»ÕýÈ·µÄ½á¹û¡£
- СÐÍ´«Ê䣬¿ªÏúºÜС£¨¹Ì¶¨³¤¶ÈµÄÍ·²¿ÊÇ 2 ×Ö½Ú£©£¬ÐÒé½»»»×îС»¯£¬ÒÔ½µµÍÍøÂçÁ÷Á¿£»
- ʹÓà Last Will ºÍ Testament ÌØÐÔ֪ͨÓйظ÷·½¿Í»§¶ËÒì³£ÖжϵĻúÖÆ¡£
MQTT Ö÷ÒªÓ¦Óó¡¾°
- ³µÁªÍø
- ¹¤ÒµÎïÁªÍø
- ÖÇÄܼҾÓ
- ÊÓÆµÖ±²¥µ¯Ä»
- IM ʵʱÁÄÌì (Ò»¶ÔÒ»ÁÄÌ죬Ⱥ×éÁÄÌì)
- ÍÆËÍ·þÎñ£¬±ÈÈçÍÆËÍʵʱÐÂÎÅ
- ½ðÈÚ½»Ò×Êý¾Ý¶©ÔÄÍÆËÍ
ÕûÌå¼Ü¹¹
µ¥»ú°æ±¾µÄ MQTT ´æÔÚ²¢·¢Á¬½ÓÊýÉÏÏÞÒÔ¼°´¦ÀíÄÜÁ¦µÄÏÞÖÆ£¬Ö÷Á÷µÄµ¥»ú°æ±¾µÄ MQTT ·þÎñ°üÀ¨ ActiveMQ£¬ RabbitMQ£¬Apollo£¬Mosquitto£¬·Ö²¼Ê½µÄ MQTT ·þÎñ°üÀ¨ÖªÃûµÄ EMQ£¬ VerneMQ ¶¼ÊDzÉÓà Erlang ʵÏֵġ£
·Ö²¼Ê½°æ±¾µÄ MQTT Ïà¶ÔÓÚµ¥»ú°æ±¾×î´óµÄÄѵãÔÚÓÚ Session µÄ¹ÜÀí£¬ÌØ±ðÊdz־û¯ session£¬MQTT ÐÒ鶨ÒåÁËÁ½ÖÖ Session£¬ÆäÖÐÒ»ÖÖÊÇ transient Session£¬ÁíÍâÒ»ÖÖÊÇ Persistent Session£¬Óû§¿ÉÒÔͨ¹ýÔÚ·¢ËÍÁ¬½ÓÐÒé°üµÄʱºòÉèÖà clean session Õâ¸ö״̬λÀ´¾ö¶¨²ÉÓÃÄÄÖÖ session¡£ÁíÍâÒ»¸öÄѵã¾ÍÊǼ¯ÈºµÄ¹ÜÀí£¬ÕâÀïÉè¼ÆµÄ¿ò¼ÜÊÇÿ¸ö broker ¶¼ÊǶԵȣ¬ËûÃÇÖ®¼ä²»´æÔÚʲôÖ÷´Ó¹ØÏµ£¬ËùÒÔÎÒÃÇÖ±½Ó AKKA Cluster Õâ¸ö¿ò¼Ü×÷Ϊ¼¯Èº¹ÜÀí£¬Ã¿¸ö broker ¶¼ÐèҪע²á¼àÌýµÄʱ¼ä°üÀ¨ MemberUp£¬MemberDown£¬MemberUnreachable£¬ClusterMemberState µÈʼþ£¬ÕâÑùÿ¸ö broker ¾ÍºÜ¿ÉÒԺܺõĸÐÖªÆäËû½ÚµãµÄ״̬£¬¶ÔÄÚ²¿µÄ session ×öÏàÓ¦µÄ´¦Àí£¬broker ºÍ broker Ö®¼äµÄÏûϢ֪ͨ²ÉÓà Akka actor À´ÊµÏÖ¡£

Broker ÄÚ²¿·þÎñ¿ò¼Ü
ΪÁ˹ÜÀí£¬ÒÔ¼°Éè¼Æ·½±ã£¬ÎÒÃǽ«ÄÚ²¿·þÎñ³éÏó³ÉΪºÜ¶à¶ÀÁ¢·þÎñ£¬ÕâЩ·þÎñ°üÀ¨£º
1.Authentication and authorization service
a) ¸Ã·þÎñ¸ºÔðÓû§Ãû£¬ÃÜÂëµÈÈÏÖ¤·½Ê½µÄ¼øÈ¨£¬ÒÔ¼°Ã¿¸ö client ¶ÔÓÚÄÇЩÖ÷ÌâÓÐȨÏÞ½øÐжÁºÍд£¬ºǫ́Êý¾ÝÈ«²¿±£´æÔÚ Mysql£¬Í¨¹ý redis ×ö cache ¼ÓËÙ£¬µ±È»Ò²×ö in memory µÄ cache ¼ÓËÙ£¬cache »ØÊÕ»úÖÆ²ÉÓà LRU ²ßÂÔ
2.Session Manager
a) ³Ö¾Ã»¯ session ¹ÜÀí£¬°üÀ¨ session ¶©ÔÄʲôÖ÷Ì⣬ÒÔ¼°¶ÔÓ¦µÄ persistent queue£¬¸Ã session ÐèÒªÔÚÿ¸ö broker ¶¼Í¬²½Ò»·Ý£¬ÕâÑù¿ÉÒÔÓÐЧ½â¾ö¸ß¿ÉÓÃÐÔµÄÎÊÌ⣬±ÈÈç crash Ö®ºó£¬²»»áÊܵ½Ó°Ïì
b) ·Ç³Ö¾Ã»¯ session ¹ÜÀí£¬°üÀ¨ session ¶©ÔÄʲôÖ÷Ì⣬ÒÔ¼°¶ÔÓ¦µÄ transient queue£¬¸Ã session Ö»ÐèÒªÔÚÁ¬½Ó»úÆ÷Éϱ£³Ö£¬²»ÐèҪͬ²½µ½ÆäËûµÄ broker ÉÏ£¬Èç¹û¶ÔÓ¦µÄ client ºÍ broker ʧȥÁ¬½ÓÖ®ºó£¬¶ÔÓ¦ session ÐÅÏ¢¾Í»á±»Çå³ýµô
3.Event Service
a) ¸ºÔð½«Á¬½Ó£¬¶©ÔĵÈʼþ·¢Ë͸øÃ¿¸ö broker£¬¶ÔÓÚÿ¸öÁ¬½Óʼþ£¬ÎÒÃǶ¼ÐèÒª½«¸ÃÏûÏ¢ÍÆË͸ø event service£¬»¹ÓоÍÊÇÿ¸ö client µÄ¶©ÔÄÖ÷Ì⣬ȡÏû¶©ÔÄÖ÷ÌâµÄʼþ£¬Ä¿Ç° event service µÄºó¶ËʵÏÖ²ÉÓà Kafka ×öµÄ£¬µ±È»Ò²¿ÉÒÔͨ¹ý Akka ±¾ÉíÌṩµÄ¹¦ÄÜÀ´×ö£¬¿¼Âǵ½ÐèÒª³Ö¾Ã»¯£¬ËùÒÔ²ÉÓÃÁË Kafka£¬ºóÆÚÎÒÃǼõÉÙ¶Ô Kafka µÄÒÀÀµ
4.Session State metadata service
a) ¸ºÔð³Ö¾Ã»¯ session metadata Êý¾Ý´æ´¢£¬¸Ã·þÎñ´Ó Event Service ¶©ÔÄÊý¾Ý£¬È»ºó¾ö¶¨ÄÄЩÊý¾ÝÐèÒª³Ö¾Ã»¯µ½ºó¶Ë´æ´¢£¨²ÉÓà Hbase ×ö³Ö¾Ã»¯´æ´¢£©£¬Ä¿Ç°Ö÷ÒªÊÇ´æ´¢³Ö¾Ã»¯ session Ïà¹ØµÄÐÅÏ¢
5.Queue Service
a) ¹ÜÀíÒÔ¼°·ÖÅä queue£¬ÕâÀïµÄ queue ·ÖΪÁ½ÖÖ£¬Ò»ÖÖÊÇ transient queue£¬Ò»ÖÖÊÇ persistent queue£¬transient queue ÊDzÉÓà in memory µÄ·½Ê½ÊµÏÖ£¬persistent queue ÊDzÉÓà Hbase ʵÏÖ¡£Transient queue ÊÇΪ transient session ´´½¨µÄ£¬persistent queue ÊÇΪ persistent session ´´½¨¡£Persistent session µÄÌØµã¾ÍÊǼ´Ê¹¸Ã session ¶ÔÓ¦µÄÁ¬½Ó¶Ï¿ªÁË£¬ÎÒÃÇÒ²Ðèά»¤¸Ã session£¬ÒÔ¼°¸Ã session ¶©ÔĵÄÊý¾Ý£¬ÒÔ±ãÏ´ÎÕâ¸ö client ÖØÐÂÁ¬½ÓÉÏÀ´Ö®ºó£¬×Ô¶¯»Ö¸´ session µÄ״̬£¬»¹ÓÐÏ·¢Ã»Óд¦ÀíÍêµÄ¶©ÔÄÊý¾Ý
6.Quota Service
a) ¹ÜÀí°üÀ¨²¢·¢Á¬½ÓÊý£¬ÉÏÐдø¿í£¬ÏÂÐдø¿íµÄÏÞÖÆ
7.Metric Service
a) ¼à¿Ø·þÎñµÄ²¢·¢Á¬½ÓÊý£¬²¢·¢ÏûÏ¢Êý£¬µ±Ç°Á÷Á¿£¬·þÎñÔËÐÐÖ¸±ê£¬°üÀ¨ CPU£¬memory£¬ÍøÂçµÈÏà¹ØÖ¸±ê

MQTT Codec Stack ½á¹¹
Á¬½Ó²ã²ÉÓà Netty NIO ¿ò¼Ü£¬¹ØÓÚ Netty NIO µÄÏêϸÉè¼Æ£¬ÕâÀïÎÒÃǾͲ»×ö½éÉÜÁË¡£Ö§³Ö 4 ÖÖÐÎʽµÄ½ÓÈ뷽ʽ£¬TCP£¬TLS£¬websocket over TLS£¬ÒÔ¼° websocket£¬¸÷¸ö½ÓÈ뷽ʽµÄ codec ²ã¼¶¹ØÏµ¿ÉÒԲο¼ÏÂͼ¡£

³Ö¾Ã»¯ Session
¶ÔÓڳ־û¯ session£¬ÐèÒª½«¸Ã session ÐÅϢͬ²½µ½Ã¿Ì¨»úÆ÷£¬Ã¿Ì¨»úÆ÷¶¼ÓÐËùÓг־û¯ session ÐÅÏ¢µÄÈ«¼¯£¬ÕâÑù×öµÄºÃ´¦¾ÍÊǵ±Ä³Ì¨ broker ÎÞ·¨¹¤×÷ÁË£¬Á¬½ÓÔÚÕâ¸öÒì³£ broker É쵀 client ²»»á¶ªÊ§ÏûÏ¢£¬Ã¿Ìõ publish µÄÏûÏ¢¶¼ÊÇÖ±½ÓдÈë hbase µÄ£¬µ± broker »Ö¸´£¬»òÕß client Á¬½Óµ½ÆäËû broker Ö®ºó£¬¿ÉÒÔ¼ÌÐø´Ó hbase »ñÈ¡Êý¾Ý£¬È»ºó·¢Ë͸ø¶©ÔÄµÄ client¡£
¶©ÔÄÏûÏ¢´¦ÀíÁ÷³Ì
¶©ÔÄÏûÏ¢»á·¢Íù event service£¬Ã¿¸ö broker ¶¼»á¶©ÔÄÀ´×Ô event service µÄÊý¾Ý£¬¶ÔÓڳ־û¯ session£¬Ã¿¸ö broker ¶¼»á´´½¨¶ÔÓ¦ session µÄ¶©ÔÄÐÅÏ¢ÒÔ¼° virtual queue£¬Õâ¸ö virtual queue ·ÖΪ client ºÍ server Á½²¿·Ö£¬client ¶ËµÄ virtual queue ¸ºÔð±£Ö¤Ð´Èë˳Ðò£¬ÒÔ¼°ÅúÁ¿Ð´È루ÌáÉýЧÂÊ£©£¬server Õâ±ßµÄ queue ±£Ö¤À´×Ô²»Í¬ broker µÄÏûÏ¢µÄÓÐÐòÐÔ¡£

·¢ËÍÏûÏ¢Á÷³Ì
C2 Íù C1 ¶©ÔĵÄÖ÷Ìâ·¢ËÍÒ»ÌõÊý¾Ý£¬router »áÖ±½Ó½«Êý¾ÝдÈë C1 ¶ÔÓ¦µÄ hbase queue£¬È»ºó֪ͨ C1£¬¸æËßËûÓÐеÄÊý¾Ý¿ÉÒÔÏû·ÑÁË£¬Õâ¸öʱºò broker Ö±½Ó´Ó hbase ¶ÁÈ¡Êý¾Ý£¬È»ºó·¢Íù C1¡£

Èç¹û Mqtt Broker 2 ³öÏÖ crash ÁË£¬±ÈÈçÕâ¸ö½ø³Ì¹ÒÁË£¬»òÕß Mqtt Broker 2 ËùÔڵĻúÆ÷¶ÏµçÁË£¬»òÕßÍøÂç³öÏÖ¹ÊÕÏÁË£¬C1 ±¾À´Ó¦¸ÃÊÕµ½µÄÊý¾Ý²¢²»»á¼õÉÙ£¬ÓÉÓÚ Mqtt Broker 1 »á¼ÌÐøÍù Hbase дÈëÊý¾Ý£¬µÈ C1 ÖØÐÂÁ¬½ÓÖ®ºó£¬¿ÉÒÔ¼ÌÐø´Ó Hbase Ïû·ÑÊý¾Ý¡£

Event service Êý¾ÝµÄ Compaction
¿¼Âdz־û¯ session Ïà¹ØµÄÊý¾Ý¶¼ÊÇдÈëµ½ kafka µÄ£¬Èç¹ûÒ»¸öÐ嵀 broker ¼ÓÈ뼯Ⱥ£¬Ê×ÏȾÍÐèÒª½«³Ö¾Ã»¯ session µÄÐÅϢȫ²¿¼ÓÔØ£¬Èç¹û¼ÓÔØ¶¼ÊÇ´Ó kafka Ö÷ÌâµÄÍ·²¿¿ªÊ¼Ïû·ÑÊý¾ÝµÄ»°£¬¿ÉÄܻỨ·ÑºÜ¾Ã£¬Îª´ËÎÒÃÇÐèÒª½« kafka µÄÊý¾Ý×ö compaction£¬ÕâЩ compaction µÄÊý¾ÝдÈëµ½ hbase£¬ÈçºÎ¼ÓÔØÈ«Á¿ÐÅÏ¢ÁË£¬È«Á¿ÐÅÏ¢¾ÍÊÇ hbase Êý¾ÝµÄ¼¯ºÏºÍ±¸·Ý checkpoint Ö®ºó kafka Êý¾Ý¼¯ºÏ merge ½á¹û¾ÍÊÇ×îÖÕµÄÈ«Á¿ÐÅÏ¢¡£

·Ç³Ö¾Ã»¯ Session
µ±·Ç³Ö¾Ã»¯ session µÄ client Á¬½ÓÉÏÀ´µÄʱºò£¬Èç¹û¶©ÔÄÖ÷Ì⣬ÎÒÃÇ»áÖ±½ÓÔÚ¸Ä client ËùÔÚ»úÆ÷´´½¨ session ÒÔ¼° session ¶ÔÓ¦µÄ queue¡£
¶©ÔÄÏûÏ¢Á÷³Ì£º

·¢ËÍÏûÏ¢Á÷³Ì£º
µ± C2 ·¢ËÍÒ»ÌõÏûÏ¢µÄʱºò£¬broker 1 »á°ÑÏûϢת·¢¸ø broker 2£¬ broker 2 »áÏȰÑÏûϢдÈëµ½ C1 ¶ÔÓ¦µÄ in memory queue£¬È»ºó·¢ËÍÒ»¸öÓÐÊý¾ÝµÄ event ¸ø C1£¬Õâ¸öʱºò broker 2 »á´Ó queue ¶ÁÈ¡Êý¾Ý£¬È»ºó·¢Íù¸ø C1¡£

»ùÓÚHBase µÄ·Ö²¼Ê½ÏûÏ¢¶ÓÁÐ
Hbase ±¾Éí²»Ìṩ queue Õâ¸ö¹¦ÄÜ£¬µ«ÊÇÎÒÃÇ¿ÉÒÔÀûÓà hbase ÌØÐÔÀ´ÊµÏÖ virtual queue µÄ¸ÅÄͨ¹ýÉè¼ÆºÃ rowkey À´±£Ö¤ÏûÏ¢µÄÓÐÐòÐÔ£¬È»ºó½«Êý¾ÝµÄ¶Áȡת»¯Îª scan ²Ù×÷£¬ÏÂͼÓÐ 4 ¸ö client£¬ÎÒÃÇΪÿ¸ö client ·ÖÅäÒ»¸ö unique µÄ queue ID£¬È»ºóÿ¸ö queue µÄÊý¾Ýͨ¹ý queue ID ºÍµ¥µ÷µÝÔöµÄ ID À´×éºÏ³ÉΪһ¸ö unique µÄ rowkey£¬ÎªÁ˱£Ö¤Ð´ÈëµÄ¾ùÔÈÐÔ£¬ÎÒÃÇÐèÒªºÏÀíÉè¼Æ unique ID µÄ prefix À´±£Ö¤½«ÕâЩ rowkey ¾ùÔȵķֲ¼µ½²»Í¬µÄ region¡£
ΪÁËʵÏÖ queue µÄ¹¦ÄÜ£¬ÎÒÃÇÔÚ Hbase É϶¨ÒåÁËÒ»¸öÐ嵀 coprocessor£¬Õâ¸ö coprocessor ÓÃÀ´´´½¨ queue£¬¹ÜÀí queue µÄÊý¾Ý£¬ÒÔ¼°É¾³ý queue£¬Í¬Ê±»¹¿ÉÒÔÐÞ¸Ä queue µÄÅä¶îµÈµÈ¡£ÏÂͼÊÇÎÒÃǵÄÒ»¸öÊÂÀý£¬ÎÒÃÇÓÐ 4 ¸ö client£¬Ã¿¸ö client ¶¼ÓÐ×Ô¼ºµÄ queue£¬Í¨¹ýËã·¨°ÑÕâЩ queue ¾ùÔȵķֲ¼µ½²»Í¬µÄ region ÉÏʹÓö¨ÖÆ region split Ëã·¨¡£
¶¨Òå queue name Ϊ reverse{clientId}_tenantId£¬ÕâÀïµÄ clientID ÊÇϵͳÉú³ÉµÄ£¬ÊÇ 64bit µÄ long£¬ÎÒÃÇΪÿ¸ö client Éú³ÉÒ»¸ö ID£¬Õâ¸ö ID Êǵ¥µ÷µÝÔöµÄ£¬¼ÓÈëÎÒÃÇÔ¤ÆÚ region µÄÊýĿΪ 128 ¸öµÄ»°£¬ÄÇôÎÒÃǾÍÈ¡ reverse{clientId}µÄÍ· 8bit ×÷Ϊ region ·Ö¸îµÄÌõ¼þ£¬ÕâÑùÎÒÃǾͿÉÒ԰Ѳ»Í¬µÄ queue ¾ùÔÈ·Ö²¼µ½²»Í¬µÄ region ÉÏÁË£¬È»ºó¶Ô region ×ö balance¡£

±£Ö¤Ð´ÈëÏûÏ¢µÄÓÐÐòÐÔ
¶ÔÓڳ־û¯ÏûÏ¢¶ÓÁУ¬ÐèÒªÔÚÿ¸ö broker É϶¼½¨Á¢Ò»¸ö virtual queue£¬¸Ã virtual queue ¶ÔÓ¦ hbase µÄÕæÊµ queue£¬Ã¿´Î virtual queue µÄÊý¾Ý¶¼ÊÇ batch дÈë hbase£¬¼ÙÉèÕâ¸ö queue µÄÃû×ÖΪ Q µÄ»°£¬ÎÒÃÇ»áΪÿ¸öдµ½ hbase µÄÏûÏ¢·ÖÅäÒ»¸ö unique µÄ ID£¬¸Ã ID ÊÇ Q_(ID)£¬ID ÊÇÒ»¸öµ¥µ÷µÝÔöµÄÊý×Ö£¬²ÉÓà 64bit µÄ long ±íʾ£¬Ã¿¸ö batch дÈëµ½ hbase µÄ coprocessor Ö®ºó£¬ÐèÒªÏÈ»ñÈ¡¸Ã queue µÄ lock£¬È»ºó·ÖÅä ID£¬È»ºó½«Êý¾ÝдÈë hbase£¬×îºóÊÍ·Å lock£¬ÕâÑùÏÂÒ»¸ö request ¾Í¿ÉÒÔ¼ÌÐøÐ´È룬ÕâÀï lock µÄÁ£¶ÈÊÇ queue ¼¶±ð£¬¾ÍÊÇÿ¸ö queue ¶¼»áÓÐ×Ô¼ºµÄÒ»¸ö lock£¬ÕâÑù¿ÉÒÔ±£Ö¤²¢·¢ÐÔ¡£
¶ÁÈ¡ queue µÄÊý¾Ý
ÎÒÃÇ»áΪÿ¸ö queue ±£´æ¸Ã queue ÔÚ Hbase µÄ×îС ID£¬ÒÔ¼°×î´ó ID£¬Èç¹û¸Ã queue µÄ×îС ID ºÍ×î´ó ID ÓÉÓÚ cache ʧЧ£¬µ¼ÖÂÄÚ´æ²»´æÔڵϰ£¬ÎÒÃǾÍͨ¹ý hbase µÄ scan ²Ù×÷£¬À´»ñÈ¡×îСµÄ ID£¬ÒÔ¼°×î´ó ID£¬È»ºó½«Êý¾Ý±£Áôµ½ cache ÀïÃæ£¬ÕâÑù¿ÉÒÔ¼ÓËÙÏ´βéÕÒ£¬Ã¿´Î¶ÁÈ¡ÌØ¶¨³¤¶ÈµÄÊý¾Ý£¬Ï´μÆËã±ãÓÚ¼ÌÐø¶ÁÈ¡£¬¶ÁÊý¾ÝµÄʱºò²¢²»ÐèÒª»ñÈ¡Ëø£¬ÓÉÓÚ¶ÁÊý¾ÝÖ»»áÀ´×Ôһ̨»úÆ÷µÄÒ»¸ö client£¬¾ÍÊÇÈκÎʱ¿ÌÖ»ÓÐÒ»¸ö client ÔÚ¶ÁÊý¾Ý¡£
ɾ³ý queue µÄÊý¾Ý
ÕâÀïµÄɾ³ýÒѾ¶ÁÈ¡µÄÊý¾Ý£¬ÓÉÓÚÎÒÃǵÄÊý¾Ý¶¼ÊÇÓÐÐòµÄ£¬ËùÒÔɾ³ýµÄʱºò£¬Ö»ÐèÒª¸æËß queue ÐèҪɾ³ý¶à³¤µÄÊý¾Ý¼´¿É£¬È»ºóÎÒÃǸù¾Ý×îС ID£¬ÒÔ¼° offset ¿ÉÒÔËã³öÐèҪɾ³ý rowkey µÄ ID£¬È»ºóÖ´ÐÐÒ»¸ö batch delete ²Ù×÷£¬ÕâÑù¾Í¿ÉÒÔ½«Êý¾Ýɾ³ýÁË£¬É¾³ýÊý¾ÝÒ²²»»áÐèÒª»ñÈ¡Ëø£¬ÓÉÓÚɾ³ýÇëÇóÖ»»áÀ´×Ôһ̨»úÆ÷µÄÒ»¸ö client£¬¾ÍÊÇÈκÎʱ¿ÌÖ»ÓÐÒ»¸ö client ÔÚɾ³ýÊý¾Ý¡£

Notes
ͬʱÓÉÓÚ Hbase Ŀǰ²¢²»´æÔÚ¹Ù·½µÄ async µÄ library À´Íù hbase дÈëÊý¾Ý£¬»òÕß¶ÁÈ¡Êý¾Ý£¬Ä¿Ç°Ö»ÓÐ opentsdb Ìṩһ¸ö°æ±¾£¬¿¼ÂÇÎÒÃÇÊÇÀûÓà coprocessor Ôö¼ÓÁËÒ»¸öÐ嵀 endpoint£¬µ«ÊÇ opentsdb µÄ async library ²¢²»Ö§³Ö coprocessor£¬ÎªÁËÎÒÃÇÐèÒªÀ©Õ¹ async µÄ library£¬ÕâÑù¾Í¿ÉÒÔ async library µÄ coprocessor ¿âÀ´´¦ÀíÊý¾Ý¡£
ÓÅ»¯
ÈçºÎÀûÓà in memory compaction À´ÓÅ»¯ hbase queue µÄÐÔÄÜÖ¸±ê£¬ÓÉÓÚ mqtt µÄÏûϢдÈë hbase Ö®ºó£¬»ù±¾ÂíÉϾͻᱻ¶ÁÈ¡³öÀ´£¬È»ºó·¢Ë͸ø client£¬ËùÒÔ˵ mqtt µÄÏûÏ¢¶¼ÊÇÊôÓÚ short lived µÄÊý¾Ý£¬Èç¹ûÕâЩÊý¾Ý¶¼ÔÚ in memory ×ö compaction µÄ»°£¬ÄǾÍÒâζÎÒÃDz»ÐèÒª½«ÕâЩÊý¾ÝдÈë HFile£¬Ö»ÐèҪд WAL ÈÕÖ¾£¬ÕâÑù¿ÉÒÔ¼«´óµÄ½µµÍ HDFS ÎļþϵͳµÄ IO£¬¶ÔÓÚÎÒÃÇÕâÖÖ³¡¾°µÄ»°£¬Hbase µÄÆ¿¾±¾Í³öÔÚ HDFS ÎļþϵͳµÄ¶ÁдÉÏ£¬Ä¿Ç° in memory compaction ÒѾÔÚ hbase 2.0 ÉÏʵÏÖ£¬²»¹ýûÓÐÕýʽ release¡£
¸ü¶à in memory compaction µÄ×ÊÁÏ¿ÉÒԲο¼£º
Accordion: HBase Breathes with In-Memory Compaction
https://blogs.apache.org/hbase/entry/accordion-hbase-breathes-with-in
Internal design:
https://blogs.apache.org/hbase/entry/accordion-developer-view-of-in
¸ü¶à queue ²å¼þ
ÿÖÖ queue ¶¼ÓÐ×Ô¼ºµÄÓÅȱµã£¬Îª´ËÎÒÃÇÌṩÁ˶àÖÖ queue ¿ÉÒÔ¹©Óû§Ñ¡Ôñ£¬¶îÍâÌṩ redis ÒÔ¼° kafka µÄ queue£¬kafka µÄ queue ÊÇÒ»ÖÖºÜ popular µÄ·½Ê½£¬Ö÷ÒªÊÇÓÃÔÚ´ó¹æÄ£ÉÈÈ볡¾°£¬±ÈÈç˵ 100w ¸ö client ¶¼Íùͬһ¸öÖ÷Ìâ·¢ËÍÏûÏ¢£¬Èç¹û²ÉÓà in memory µÄ queue »òÕß hbase µÄ queue£¬ÄÇôƿ¾±¾Í»á³öÔÚ¶©ÔĶˣ¨Ö»ÓÐÒ»¸ö TCP Á¬½ÓÀ´´¦ÀíÊý¾Ý£©£¬Èç¹û²ÉÓà kafka queue£¬¿ÉÒÔ½«Êý¾Ý·¢Íù kafka µÄÖ÷Ì⣬Ȼºóµ÷Óà kafka µÄ client À´Ïû·ÑÊý¾Ý£¬ÕâÑù¾Í¿ÉÒÔÍêÃÀ½â¾ö´óÉÈÈëµÄ³¡¾°¡£
¶à×â»§¼Ü¹¹
Ŀǰ MQTT ·þÎñÊÇÒ»¸ö·Ö²¼Ê½¶à×â»§µÄ·þÎñ£¬Ò»¸ö IotHub ÉÏÃæ»áÓкܶà×â»§µÄ MQTT Broker£¬Ã¿¸ö MQTT broker ¶ÔÓ¦Ò»¸ö tenant£¬Ã¿¸ö broker ÓÐ×Ô¼ºµÄ authentication service, session manager, Queue service£¬ÒÔ¼°ºÜ¶àÆäËû·þÎñ£¬°üÀ¨ unique Id generator£¬backend storage service£¬ÒÔ¼° router ·þÎñ£¬µ±Ò»¸ö client µÄͨ¹ý TCP ºÍÎÒÃǵķþÎñ½¨Á¢Á¬½ÓÖ®ºó£¬Ê×ÏÈÎÒÃÇ»áΪ¸Ã client ´´½¨Ò»¸ö session£¬Õâ¸ö session »á¼ì²é¸Ã client ÊÇ·ñºÏ·¨£¬°üÀ¨ tenant Ãû×Ö£¬Óû§Ãû£¬ÃÜÂ룬Èç¹ûËùÓеͼºÏ·¨µÄ»°£¬ÎÒÃÇ»á°ÑÕâ¸ö client µÄ session Ìí¼Óµ½ session manager£¬Èç¹û²»ÊǺϷ¨µÄ£¬ÎÒÃÇ»áÖ±½Ó°ÑÕâ¸ö client µÄÁ¬½Ó¸ø¶Ï¿ª¡£
MQTT ²ÉÓà TCP µÄ·½Ê½ºÍÔÆ¶Ë½¨Á¢Á¬½Ó£¬ÎÒÃÇͨ¹ýÓû§ÃûÀ´Çø·ÖÕâ¸ö client ¶ÔÓ¦µÄÊÇÄǸö tenant£¬ËùÒÔÎÒÃǶÔÓû§ÃûÓÐÑϸñµÄ¹æ¶¨£¬Óû§Ãû±ØÐëÊÇ{tenant Name}/{clientName}£¬Äõ½Óû§ÃûºÍÃÜÂëÖ®ºó£¬ÎÒÃÇÏÈËã³ö¸Ã client ¶ÔÓ¦µÄ tenant name£¬È»ºó»ñÈ¡¸Ã tenant ¶ÔÓ¦ broker ʵÀý£¬ºóÈ¥¸Ã broker µÄ auth ·þÎñÀ´ÈÏÖ¤Óû§ÃûºÍÃÜÂë×éºÏ¡£

²âÊÔÊý¾Ý
Baidu IoT Hub vs EMQTT
MPS: message per seconds
ÏûÏ¢ payload ´óС: 1024 bytes
³¡¾°£ºÒ»°ë pub ºÍÒ»°ë sub£¬Ã¿Ò»¸ö pub ¶ÔÓ¦Ò»¸ö sub£¬Ò²¾ÍÊÇ˵ͨ¹ýΨһÖ÷Ìâ¹ØÁªÆðÀ´£¬ÕâÖÖ³¡¾°ÊÇ¶Ô MQTT ÐÒé×îÑϸñµÄ¿¼Ñ飬ÆäËû³¡¾°Ïà¶ÔÀ´Ëµ CPU ÏûºÄ»áÉÙһЩ
²âÊÔ Queue ÀàÐÍ£ºIn memory queue
Notes
ÓÉÓÚ Pub ºÍ Sub ÊÇÒ»Ò»¶ÔÓ¦µÄ£¬ËùÕâÀïµÄ MPS ÊÇÖ¸ PUB µÄ QPS£¬ËùÒÔʵ¼Ê QPS ÊÇÕâ¸öÊý×ÖµÄÁ½±¶¡£


¿ÉÓà MPS£¨ÎÞ¶ª°ü£¬latency СÓÚ 0.5s£©£º

½áÂÛ£ºÍ¬µÈÁ¬½ÓÊýÏ£¬IoT Hub µÄ¿ÉÓÃ×î´óÍÌÍÂÁ¿ÔÚ EMQTT µÄ 1~2 ±¶Ö®¼ä¡£
²¿Êð broker »úÆ÷ÅäÖÃÐÅÏ¢£º
vendor_id: GenuineIntel
cpu family: 6
model: 45
model name: Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz
core: 12
Memory:
MemTotal: 132137288 kB
¸ü¶à¹ØÓÚ°Ù¶È IoT Hub ʹÓÃÐÅÏ¢¿ÉÒÔ·ÃÎʹÙÍø¡£ |