Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
¹²ÏíÐÐÒµµÄ·Ö²¼Ê½MQTTÉè¼Æ
 
À´Ô´:InfoQ ·¢²¼ÓÚ:2017-6-14
  4098  次浏览      27
 

±³¾°

Ëæ×ÅÒÆ¶¯»¥ÁªÍøÂýÂý½øÈëºó°ë³¡£¬Ô½À´Ô½¶àµÄ¹«Ë¾½«×¢ÒâÁ¦×ªÒƵ½ÎïÁªÍø£¬Ï£Íûͨ¹ýÔçÆÚ²¼¾ÖÀ´Æðµ½Õ¼ÁìÕâ¸öÐÐÒµµÄÖÆ¸ßµã£¬±ÈÈçĿǰÁ÷ÐеÄĦ°Ýµ¥³µ£¬OFO µ¥³µ¶¼ÊǵäÐ͵ÄÎïÁªÍøÓ¦Óá£ÎïÁªÍø±¾Éí²¢²»ÊÇʲôиÅÄî£¬Ëæ×Å´óÊý¾Ý£¬AI µÈ¼¼ÊõµÄ·¢Õ¹£¬´ó¼ÒÒâʶµ½´«Í³µÄÎïÁªÍøÍ¨¹ýÒ»¶¨¸ÄÔ죬½èÖú´óÊý¾ÝÒÔ¼° AI ¼¼Êõ¿ÉÒÔ»ñµÃºÜ¶à¶îÍâµÄ¼ÛÖµ¡£

ÕâÀïÖ÷Òª½éÉÜÎïÁªÍøµÄ½ÓÈë·þÎñ£¬ÎïÁªÍøÖ÷Á÷½ÓÈëЭÒé·ÖΪ MQTT£¬CoaP£¬Http£¬XMPPµÈ¼¸ÖÖ£¬±¾ÎÄÖ÷ÒªÊǽéÉÜ MQTT ЭÒéµÄÓÅȱµãÒÔ¼°ÈçºÎʵÏÖ MQTT µÄ·Ö²¼Ê½¿ò¼Ü£¬ÖÁÓÚ¸÷¸öЭÒéÖ®¼äµÄ±È½Ï¾Í²»ÔÙÕâÀïÏêϸ½éÉÜ£¬´ó¼Ò¿ÉÒÔ°Ù¶ÈÏà¹Ø×ÊÁÏÈ¥×öÏêϸÁ˽⡣

MQTT ЭÒéÖ÷ÒªÌØµã

MQTT ЭÒéÊÇΪ´óÁ¿¼ÆËãÄÜÁ¦ÓÐÏÞ£¬ÇÒ¹¤×÷Ôڵʹø¿í¡¢²»¿É¿¿µÄÍøÂçµÄÔ¶³Ì´«¸ÐÆ÷ºÍ¿ØÖÆÉ豸ͨѶ¶øÉè¼ÆµÄЭÒ飬Ëü¾ßÓÐÒÔÏÂÖ÷ÒªµÄ¼¸ÏîÌØÐÔ£º

  1. ʹÓ÷¢²¼ / ¶©ÔÄÏûϢģʽ£¬Ìṩһ¶Ô¶àµÄÏûÏ¢·¢²¼£¬½â³ýÓ¦ÓóÌÐòñîºÏ£»
  2. ¶Ô¸ºÔØÄÚÈÝÆÁ±ÎµÄÏûÏ¢´«Ê䣻
  3. ʹÓà TCP/IP Ìá¹©ÍøÂçÁ¬½Ó£»
  4. ÓÐÈýÖÖÏûÏ¢·¢²¼·þÎñÖÊÁ¿£º

    ¡°ÖÁ¶àÒ»´Î¡±£¬ÏûÏ¢·¢²¼ÍêÈ«ÒÀÀµµ×²ã TCP/IP ÍøÂç¡£»á·¢ÉúÏûÏ¢¶ªÊ§»òÖØ¸´¡£ÕâÒ»¼¶±ð¿ÉÓÃÓÚÈçÏÂÇé¿ö£¬»·¾³´«¸ÐÆ÷Êý¾Ý£¬¶ªÊ§Ò»´Î¼Ç¼ÎÞËùν£¬ÒòΪ²»¾Ãºó»¹»áÓеڶþ´Î·¢ËÍ¡£

    ¡°ÖÁÉÙÒ»´Î¡±£¬È·±£ÏûÏ¢µ½´ï£¬µ«ÏûÏ¢ÖØ¸´¿ÉÄܻᷢÉú¡£

    ¡°Ö»ÓÐÒ»´Î¡±£¬È·±£ÏûÏ¢µ½´ïÒ»´Î¡£ÕâÒ»¼¶±ð¿ÉÓÃÓÚÈçÏÂÇé¿ö£¬ÔڼƷÑϵͳÖУ¬ÏûÏ¢ÖØ¸´»ò¶ªÊ§»áµ¼Ö²»ÕýÈ·µÄ½á¹û¡£

  5. СÐÍ´«Ê䣬¿ªÏúºÜС£¨¹Ì¶¨³¤¶ÈµÄÍ·²¿ÊÇ 2 ×Ö½Ú£©£¬Ð­Òé½»»»×îС»¯£¬ÒÔ½µµÍÍøÂçÁ÷Á¿£»
  6. ʹÓà Last Will ºÍ Testament ÌØÐÔ֪ͨÓйظ÷·½¿Í»§¶ËÒì³£ÖжϵĻúÖÆ¡£

MQTT Ö÷ÒªÓ¦Óó¡¾°

  1. ³µÁªÍø
  2. ¹¤ÒµÎïÁªÍø
  3. ÖÇÄܼҾÓ
  4. ÊÓÆµÖ±²¥µ¯Ä»
  5. IM ʵʱÁÄÌì (Ò»¶ÔÒ»ÁÄÌ죬Ⱥ×éÁÄÌì)
  6. ÍÆËÍ·þÎñ£¬±ÈÈçÍÆËÍʵʱÐÂÎÅ
  7. ½ðÈÚ½»Ò×Êý¾Ý¶©ÔÄÍÆËÍ

ÕûÌå¼Ü¹¹

µ¥»ú°æ±¾µÄ 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 ʹÓÃÐÅÏ¢¿ÉÒÔ·ÃÎʹÙÍø¡£

   
4098 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù