1.Lambda¼Ü¹¹±³¾°½éÉÜ
Lambda¼Ü¹¹ÊÇÓÉStormµÄ×÷ÕßNathan MarzÌá³öµÄÒ»¸öʵʱ´óÊý¾Ý´¦Àí¿ò¼Ü¡£MarzÔÚTwitter¹¤×÷ÆÚ¼ä¿ª·¢ÁËÖøÃûµÄʵʱ´óÊý¾Ý´¦Àí¿ò¼ÜStorm£¬Lambda¼Ü¹¹ÊÇÆä¸ù¾Ý¶àÄê½øÐзֲ¼Ê½´óÊý¾ÝϵͳµÄ¾Ñé×ܽáÌáÁ¶¶ø³É¡£
Lambda¼Ü¹¹µÄÄ¿±êÊÇÉè¼Æ³öÒ»¸öÄÜÂú×ãʵʱ´óÊý¾Ýϵͳ¹Ø¼üÌØÐԵļܹ¹£¬°üÀ¨ÓУº¸ßÈÝ´í¡¢µÍÑÓʱºÍ¿ÉÀ©Õ¹µÈ¡£Lambda¼Ü¹¹ÕûºÏÀëÏß¼ÆËãºÍʵʱ¼ÆË㣬Èںϲ»¿É±äÐÔ£¨Immunability£©£¬¶Áд·ÖÀëºÍ¸´ÔÓÐÔ¸ôÀëµÈһϵÁмܹ¹ÔÔò£¬¿É¼¯³ÉHadoop£¬Kafka£¬Storm£¬Spark£¬HbaseµÈ¸÷Àà´óÊý¾Ý×é¼þ¡£
2.´óÊý¾ÝϵͳµÄ¹Ø¼üÌØÐÔ
MarzÈÏΪ´óÊý¾ÝϵͳӦ¾ßÓÐÒÔϵĹؼüÌØÐÔ£º
Robust and fault-tolerant£¨ÈÝ´íÐԺͳ°ôÐÔ£©£º¶Ô´ó¹æÄ£·Ö²¼Ê½ÏµÍ³À´Ëµ£¬»úÆ÷ÊDz»¿É¿¿µÄ£¬¿ÉÄܻᵱ»ú£¬µ«ÊÇϵͳÐèÒªÊǽ¡×³¡¢ÐÐΪÕýÈ·µÄ£¬¼´Ê¹ÊÇÓöµ½»úÆ÷´íÎó¡£³ýÁË»úÆ÷´íÎó£¬È˸ü¿ÉÄܻ᷸´íÎó¡£ÔÚÈí¼þ¿ª·¢ÖÐÄÑÃâ»áÓÐһЩBug£¬ÏµÍ³±ØÐë¶ÔÓÐBugµÄ³ÌÐòдÈëµÄ´íÎóÊý¾ÝÓÐ×ã¹»µÄÊÊÓ¦ÄÜÁ¦£¬ËùÒԱȻúÆ÷ÈÝ´íÐÔ¸ü¼ÓÖØÒªµÄÈÝ´íÐÔÊÇÈËΪ²Ù×÷ÈÝ´íÐÔ¡£¶ÔÓÚ´ó¹æÄ£µÄ·Ö²¼Ê½ÏµÍ³À´Ëµ£¬È˺ͻúÆ÷µÄ´íÎóÿÌì¶¼¿ÉÄܻᷢÉú£¬ÈçºÎÓ¦¶ÔÈ˺ͻúÆ÷µÄ´íÎó£¬ÈÃϵͳÄܹ»´Ó´íÎóÖпìËÙ»Ö¸´ÓÈÆäÖØÒª¡£
Low latency reads and updates£¨µÍÑÓʱ£©£ººÜ¶àÓ¦ÓöÔÓÚ¶ÁºÍд²Ù×÷µÄÑÓʱҪÇó·Ç³£¸ß£¬ÒªÇó¶Ô¸üкͲéѯµÄÏìÓ¦ÊǵÍÑÓʱµÄ¡£
Scalable£¨ºáÏòÀ©ÈÝ£©£ºµ±Êý¾ÝÁ¿/¸ºÔØÔö´óʱ£¬¿ÉÀ©Õ¹ÐÔµÄϵͳͨ¹ýÔö¼Ó¸ü¶àµÄ»úÆ÷×ÊÔ´À´Î¬³ÖÐÔÄÜ¡£Ò²¾ÍÊdz£ËµµÄϵͳÐèÒªÏßÐÔ¿ÉÀ©Õ¹£¬Í¨³£²ÉÓÃscale
out£¨Í¨¹ýÔö¼Ó»úÆ÷µÄ¸öÊý£©¶ø²»ÊÇscale up£¨Í¨¹ýÔöÇ¿»úÆ÷µÄÐÔÄÜ£©¡£
General£¨Í¨ÓÃÐÔ£©£ºÏµÍ³ÐèÒªÄܹ»ÊÊÓ¦¹ã·ºµÄÓ¦Ó㬰üÀ¨½ðÈÚÁìÓò¡¢Éç½»ÍøÂç¡¢µç×ÓÉÌÎñÊý¾Ý·ÖÎöµÈ¡£
Extensible£¨¿ÉÀ©Õ¹£©£ºÐèÒªÔö¼Óй¦ÄÜ¡¢ÐÂÌØÐÔʱ£¬¿ÉÀ©Õ¹µÄϵͳÄÜÒÔ×îСµÄ¿ª·¢´ú¼ÛÀ´Ôö¼Óй¦ÄÜ¡£
Allows ad hoc queries£¨·½±ã²éѯ£©£ºÊý¾ÝÖÐÔ̺¬ÓмÛÖµ£¬ÐèÒªÄܹ»·½±ã¡¢¿ìËٵIJéѯ³öËùÐèÒªµÄÊý¾Ý¡£
Minimal maintenance£¨Ò×ÓÚά»¤£©£ºÏµÍ³ÒªÏë×öµ½Ò×ÓÚά»¤£¬Æä¹Ø¼üÊÇ¿ØÖÆÆä¸´ÔÓÐÔ£¬Ô½ÊǸ´ÔÓµÄϵͳԽÈÝÒ׳ö´í¡¢Ô½ÄÑά»¤¡£
Debuggable£¨Ò×µ÷ÊÔ£©£ºµ±³öÎÊÌâʱ£¬ÏµÍ³ÐèÒªÓÐ×ã¹»µÄÐÅÏ¢À´µ÷ÊÔ´íÎó£¬ÕÒµ½ÎÊÌâµÄ¸ùÔ´¡£Æä¹Ø¼üÊÇÄܹ»×·¸ùËÝÔ´µ½Ã¿¸öÊý¾ÝÉú³Éµã¡£
3.Êý¾ÝϵͳµÄ±¾ÖÊ
ΪÁËÉè¼Æ³öÄÜÂú×ãǰÊöµÄ´óÊý¾Ý¹Ø¼üÌØÐÔµÄϵͳ£¬ÎÒÃÇÐèÒª¶ÔÊý¾ÝϵͳÓб¾ÖÊÐÔµÄÀí½â¡£ÎÒÃǿɽ«Êý¾Ýϵͳ¼ò»¯Îª£º
Êý¾Ýϵͳ = Êý¾Ý + ²éѯ
´Ó¶ø´ÓÊý¾ÝºÍ²éѯÁ½·½ÃæÀ´ÈÏʶ´óÊý¾ÝϵͳµÄ±¾ÖÊ¡£
3.1.Êý¾ÝµÄ±¾ÖÊ
3.1.1.Êý¾ÝµÄÌØÐÔ£ºWhen & What
ÎÒÃÇÏÈ´Ó¡°Êý¾Ý¡±µÄÌØÐÔ̸Æð¡£Êý¾ÝÊÇÒ»¸ö²»¿É·Ö¸îµÄµ¥Î»£¬Êý¾ÝÓÐÁ½¸ö¹Ø¼üµÄÐÔÖÊ£ºWhenºÍWhat¡£
WhenÊÇÖ¸Êý¾ÝÊÇÓëʱ¼äÏà¹ØµÄ£¬Êý¾ÝÒ»¶¨ÊÇÔÚij¸öʱ¼äµã²úÉúµÄ¡£±ÈÈçLogÈÕÖ¾¾ÍÒþº¬×Ű´ÕÕʱ¼äÏȺó˳Ðò²úÉúµÄÊý¾Ý£¬LogÇ°ÃæµÄÈÕÖ¾Êý¾ÝÒ»¶¨ÏÈÓÚLogºóÃæµÄÈÕÖ¾Êý¾Ý²úÉú£»ÏûϢϵͳÖÐÏûÏ¢µÄ½ÓÊÜÕßÒ»¶¨ÊÇÔÚÏûÏ¢µÄ·¢ËÍÕß·¢ËÍÏûÏ¢ºó½ÓÊÕµ½µÄÏûÏ¢¡£Ïà±ÈÓÚÊý¾Ý¿â£¬Êý¾Ý¿âÖбíµÄ¼Ç¼¾Í¶ªÊ§ÁËʱ¼äÏȺó˳ÐòµÄÐÅÏ¢£¬ÖмäijÌõ¼Ç¼¿ÉÄÜÊÇÔÚ×îºóÒ»Ìõ¼Ç¼²úÉúºó·¢Éú¸üеġ£¶ÔÓÚ·Ö²¼Ê½ÏµÍ³£¬Êý¾ÝµÄʱ¼äÌØÐÔÓÈÆäÖØÒª¡£·Ö²¼Ê½ÏµÍ³ÖÐÊý¾Ý¿ÉÄܲúÉúÓÚ²»Í¬µÄϵͳÖУ¬Ê±¼ä¾ö¶¨ÁËÊý¾Ý·¢ÉúµÄÈ«¾ÖÏȺó˳Ðò¡£±ÈÈç¶ÔÒ»¸öÖµ×öËãÊõÔËË㣬ÏÈ+2£¬ºó*3£¬ÓëÏÈ*3£¬ºó+2£¬µÃµ½µÄ½á¹ûÍêÈ«²»Í¬¡£Êý¾ÝµÄʱ¼äÐÔÖʾö¶¨ÁËÊý¾ÝµÄÈ«¾Ö·¢ÉúÏȺó£¬Ò²¾Í¾ö¶¨ÁËÊý¾ÝµÄ½á¹û¡£
WhatÊÇÖ¸Êý¾ÝµÄ±¾Éí¡£ÓÉÓÚÊý¾Ý¸úij¸öʱ¼äµãÏà¹Ø£¬ËùÒÔÊý¾ÝµÄ±¾ÉíÊDz»¿É±äµÄ(immutable)£¬¹ýÍùµÄÊý¾ÝÒѾ³ÉΪÊÂʵ£¨Fact£©£¬Äã²»¿ÉÄܻص½¹ýÈ¥µÄij¸öʱ¼äµãÈ¥¸Ä±äÊý¾ÝÊÂʵ¡£ÕâÒ²¾ÍÒâζ×ŶÔÊý¾ÝµÄ²Ù×÷ÆäʵֻÓÐÁ½ÖÖ£º¶ÁÈ¡ÒÑ´æÔÚµÄÊý¾ÝºÍÌí¼Ó¸ü¶àµÄÐÂÊý¾Ý¡£²ÉÓÃÊý¾Ý¿âµÄ¼Ç·¨£¬CRUD¾Í±ä³ÉÁËCR£¬UpdateºÍDelete±¾ÖÊÉÏÆäʵÊÇвúÉúµÄÊý¾ÝÐÅÏ¢£¬ÓÃCÀ´¼Ç¼¡£
3.1.2.Êý¾ÝµÄ´æ´¢£ºStore Everything Rawly and Immutably
¸ù¾ÝÉÏÊö¶ÔÊý¾Ý±¾ÖÊÌØÐԵķÖÎö£¬Lamba¼Ü¹¹ÖжÔÊý¾ÝµÄ´æ´¢²ÉÓõķ½Ê½ÊÇ£ºÊý¾Ý²»¿É±ä£¬´æ´¢ËùÓÐÊý¾Ý¡£
ͨ¹ý²ÉÓò»¿É±ä·½Ê½´æ´¢ËùÓеÄÊý¾Ý£¬¿ÉÒÔÓÐÈçϺô¦£º
¼òµ¥¡£²ÉÓò»¿É±äµÄÊý¾ÝÄ£ÐÍ£¬´æ´¢Êý¾ÝʱֻÐèÒª¼òµ¥µÄÍùÖ÷Êý¾Ý¼¯ºó×·¼ÓÊý¾Ý¼´¿É¡£Ïà±ÈÓÚ²ÉÓÿɱäµÄÊý¾ÝÄ£ÐÍ£¬ÎªÁËUpdate²Ù×÷£¬Êý¾Ýͨ³£ÐèÒª±»Ë÷Òý£¬´Ó¶øÄÜ¿ìËÙÕÒµ½Òª¸üеÄÊý¾ÝÈ¥×ö¸üвÙ×÷¡£
Ó¦¶ÔÈËΪºÍ»úÆ÷µÄ´íÎó¡£Ç°ÊöÖÐÌáµ½È˺ͻúÆ÷ÿÌì¶¼¿ÉÄÜ»á³ö´í£¬ÈçºÎÓ¦¶ÔÈ˺ͻúÆ÷µÄ´íÎó£¬ÈÃϵͳÄܹ»´Ó´íÎóÖпìËÙ»Ö¸´¼«ÆäÖØÒª¡£²»¿É±äÐÔ£¨Immutability£©ºÍÖØÐ¼ÆË㣨Recomputation£©ÔòÊÇÓ¦¶ÔÈËΪºÍ»úÆ÷´íÎóµÄ³£Ó÷½·¨¡£²ÉÓÿɱäÊý¾ÝÄ£ÐÍ£¬Òý·¢´íÎóµÄÊý¾ÝÓпÉÄܱ»¸²¸Ç¶ø¶ªÊ§¡£Ïà±ÈÓÚ²ÉÓò»¿É±äµÄÊý¾ÝÄ£ÐÍ£¬ÒòΪËùÓеÄÊý¾Ý¶¼ÔÚ£¬Òý·¢´íÎóµÄÊý¾ÝÒ²ÔÚ¡£ÐÞ¸´µÄ·½·¨¾Í¿ÉÒÔ¼òµ¥µÄÊDZéÀúÊý¾Ý¼¯ÉÏ´æ´¢µÄËùÓеÄÊý¾Ý£¬¶ªÆú´íÎóµÄÊý¾Ý£¬ÖØÐ¼ÆËãµÃµ½Views£¨ViewµÄ¸ÅÄî²Î¿¼4.1.2£©¡£ÖØÐ¼ÆËãµÄ¹Ø¼üµãÔÚÓÚÀûÓÃÊý¾ÝµÄʱ¼äÌØÐÔ¾ö¶¨µÄÈ«¾Ö´ÎÐò£¬ÒÀ´Î˳ÐòÖØÐÂÖ´ÐУ¬±ØÈ»Äܵõ½ÕýÈ·µÄ½á¹û¡£
µ±Ç°Òµ½çÓкܶà²ÉÓò»¿É±äÊý¾ÝÄ£ÐÍÀ´´æ´¢ËùÓÐÊý¾ÝµÄÀý×Ó¡£±ÈÈç·Ö²¼Ê½Êý¾Ý¿âDatomic£¬»ùÓÚ²»¿É±äÊý¾ÝÄ£ÐÍÀ´´æ´¢Êý¾Ý£¬´Ó¶ø¼ò»¯ÁËÉè¼Æ¡£·Ö²¼Ê½ÏûÏ¢Öмä¼þKafka£¬»ùÓÚLogÈÕÖ¾£¬ÒÔ×·¼Óappend-onlyµÄ·½Ê½À´´æ´¢ÏûÏ¢¡£
3.2.²éѯ
²éѯÊǸöʲô¸ÅÄMarz¸ø²éѯÈçÏÂÒ»¸ö¼òµ¥µÄ¶¨Ò壺
Query = Function(All Data)
¸ÃµÈʽµÄº¬ÒåÊÇ£º²éѯÊÇÓ¦ÓÃÓÚÊý¾Ý¼¯Éϵĺ¯Êý¡£¸Ã¶¨Òå¿´ËÆ¼òµ¥£¬È´¼¸ºõÄÒÀ¨ÁËÊý¾Ý¿âºÍÊý¾ÝϵͳµÄËùÓÐÁìÓò£ºRDBMS¡¢Ë÷Òý¡¢OLAP¡¢OLTP¡¢MapReduce¡¢EFL¡¢·Ö²¼Ê½Îļþϵͳ¡¢NoSQLµÈ¶¼¿ÉÒÔÓÃÕâ¸öµÈʽÀ´±íʾ¡£
ÈÃÎÒÃǽøÒ»²½ÉîÈ뿴һϺ¯ÊýµÄÌØÐÔ£¬´Ó¶øÍÚ¾òº¯Êý×ÔÉíµÄÌØµãÀ´Ö´Ðвéѯ¡£
ÓÐÒ»Àà³ÆÎªMonoidÌØÐԵĺ¯ÊýÓ¦Ó÷dz£¹ã·º¡£MonoidµÄ¸ÅÄîÀ´Ô´ÓÚ·¶³ëѧ£¨Category Theory£©£¬ÆäÒ»¸öÖØÒªÌØÐÔÊÇÂú×ã½áºÏÂÉ¡£ÈçÕûÊýµÄ¼Ó·¨¾ÍÂú×ãMonoidÌØÐÔ£º
(a+b)+c=a+(b+c)
²»Âú×ãMonoidÌØÐԵĺ¯ÊýºÜ¶àʱºò¿ÉÒÔת»¯³É¶à¸öÂú×ãMonoidÌØÐԵĺ¯ÊýµÄÔËËã¡£Èç¶à¸öÊýµÄƽ¾ùÖµAvgº¯Êý£¬¶à¸öƽ¾ùֵû·¨Ö±½Óͨ¹ý½áºÏÀ´µÃµ½×îÖյį½¾ùÖµ£¬µ«ÊÇ¿ÉÒÔ²ð³É·Öĸ³ýÒÔ·Ö×Ó£¬·ÖĸºÍ·Ö×Ó¶¼ÊÇÕûÊýµÄ¼Ó·¨£¬´Ó¶øÂú×ãMonoidÌØÐÔ¡£
MonoidµÄ½áºÏÂÉÌØÐÔÔÚ·Ö²¼Ê½¼ÆËãÖм«ÆäÖØÒª£¬Âú×ãMonoidÌØÐÔÒâζ×ÅÎÒÃÇ¿ÉÒÔ½«¼ÆËã·Ö½âµ½¶ą̀»úÆ÷²¢ÐÐÔËË㣬ȻºóÔÙ½áºÏ¸÷×ԵIJ¿·ÖÔËËã½á¹ûµÃµ½×îÖÕ½á¹û¡£Í¬Ê±Ò²Òâζ×Ų¿·ÖÔËËã½á¹û¿ÉÒÔ´¢´æÏÂÀ´±»±ðµÄÔËËã¹²ÏíÀûÓã¨Èç¹û¸ÃÔËËãÒ²°üº¬ÏàͬµÄ²¿·Ö×ÓÔËË㣩£¬´Ó¶ø¼õÉÙÖØ¸´ÔËËãµÄ¹¤×÷Á¿¡£
4.Lambda¼Ü¹¹
ÓÐÁËÉÏÃæ¶ÔÊý¾Ýϵͳ±¾ÖʵÄ̽ÌÖ£¬ÏÂÃæÎÒÃÇÀ´ÌÖÂÛ´óÊý¾ÝϵͳµÄ¹Ø¼üÎÊÌ⣺ÈçºÎʵʱµØÔÚÈÎÒâ´óÊý¾Ý¼¯ÉϽøÐвéѯ£¿´óÊý¾ÝÔÙ¼ÓÉÏʵʱ¼ÆË㣬ÎÊÌâµÄÄѶȱȽϴó¡£
×î¼òµ¥µÄ·½·¨ÊÇ£¬¸ù¾ÝǰÊöµÄ²éѯµÈʽQuery = Function(All Data)£¬ÔÚÈ«ÌåÊý¾Ý¼¯ÉÏÔÚÏßÔËÐвéѯº¯ÊýµÃµ½½á¹û¡£µ«Èç¹ûÊý¾ÝÁ¿±È½Ï´ó£¬¸Ã·½·¨µÄ¼ÆËã´ú¼ÛÌ«´óÁË£¬ËùÒÔ²»ÏÖʵ¡£
Lambda¼Ü¹¹Í¨¹ý·Ö½âµÄÈý²ã¼Ü¹¹À´½â¾ö¸ÃÎÊÌ⣺Batch Layer£¬Speed LayerºÍServing
Layer¡£
4.1.Batch Layer
Batch LayerµÄ¹¦ÄÜÖ÷ÒªÓÐÁ½µã£º
´æ´¢Êý¾Ý¼¯
ÔÚÊý¾Ý¼¯ÉÏÔ¤ÏȼÆËã²éѯº¯Êý£¬¹¹½¨²éѯËù¶ÔÓ¦µÄView
4.1.1.´¢´æÊý¾Ý¼¯
¸ù¾ÝǰÊö¶ÔÊý¾ÝWhen&WhatÌØÐÔµÄÌÖÂÛ£¬Batch Layer²ÉÓò»¿É±äÄ£ÐÍ´æ´¢ËùÓеÄÊý¾Ý¡£ÒòΪÊý¾ÝÁ¿±È½Ï´ó£¬¿ÉÒÔ²ÉÓÃHDFSÖ®ÀàµÄ´óÊý¾Ý´¢´æ·½°¸¡£Èç¹ûÐèÒª°´ÕÕÊý¾Ý²úÉúµÄʱ¼äÏȺó˳Ðò´æ·ÅÊý¾Ý£¬¿ÉÒÔ¿¼ÂÇÈçInfluxDBÖ®ÀàµÄʱ¼äÐòÁÐÊý¾Ý¿â£¨TSDB£©´æ´¢·½°¸¡£
4.1.2.¹¹½¨²éѯView
ÉÏÃæËµµ½¸ù¾ÝµÈʽQuery = Function(All Data)£¬ÔÚÈ«ÌåÊý¾Ý¼¯ÉÏÔÚÏßÔËÐвéѯº¯ÊýµÃµ½½á¹ûµÄ´ú¼ÛÌ«´ó¡£µ«Èç¹ûÎÒÃÇÔ¤ÏÈÔÚÊý¾Ý¼¯ÉϼÆËã²¢±£´æ²éѯº¯ÊýµÄ½á¹û£¬²éѯµÄʱºò¾Í¿ÉÒÔÖ±½Ó·µ»Ø½á¹û£¨»òͨ¹ý¼òµ¥µÄ¼Ó¹¤ÔËËã¾Í¿ÉµÃµ½½á¹û£©¶øÎÞÐèÖØÐ½øÐÐÍêÕû·ÑʱµÄ¼ÆËãÁË¡£Õâ¶ù¿ÉÒÔ°ÑBatch
Layer¿´³ÉÊÇÒ»¸öÊý¾ÝÔ¤´¦ÀíµÄ¹ý³Ì¡£ÎÒÃǰÑÕë¶Ô²éѯԤÏȼÆËã²¢±£´æµÄ½á¹û³ÆÎªView£¬ViewÊÇLamba¼Ü¹¹µÄÒ»¸öºËÐĸÅÄËüÊÇÕë¶Ô²éѯµÄÓÅ»¯£¬Í¨¹ýView¼´¿ÉÒÔ¿ìËٵõ½²éѯ½á¹û¡£
Èç¹û²ÉÓÃHDFSÀ´´¢´æÊý¾Ý£¬ÎÒÃǾͿÉÒÔʹÓÃMapReduceÀ´ÔÚÊý¾Ý¼¯ÉϹ¹½¨²éѯµÄView¡£Batch
LayerµÄ¹¤×÷¿ÉÒÔ¼òµ¥µÄÓÃÈçÏÂαÂë±íʾ£º
¸Ã¹¤×÷¿´ËƼòµ¥£¬ÊµÖʷdz£Ç¿´ó¡£ÈκÎÈËΪ»ò»úÆ÷·¢ÉúµÄ´íÎ󣬶¼¿ÉÒÔͨ¹ýÐÞÕý´íÎóºóÖØÐ¼ÆËãÀ´»Ö¸´µÃµ½ÕýÈ·½á¹û¡£
¶ÔViewµÄÀí½â£º
ViewÊÇÒ»¸öºÍÒµÎñ¹ØÁªÐԱȽϴóµÄ¸ÅÄViewµÄ´´½¨ÐèÒª´ÓÒµÎñ×ÔÉíµÄÐèÇó³ö·¢¡£Ò»¸öͨÓõÄÊý¾Ý¿â²éѯϵͳ£¬²éѯ¶ÔÓ¦µÄº¯Êýǧ±äÍò»¯£¬²»¿ÉÄÜÇî¾Ù¡£µ«ÊÇÈç¹û´ÓÒµÎñ×ÔÉíµÄÐèÇó³ö·¢£¬¿ÉÒÔ·¢ÏÖÒµÎñËùÐèÒªµÄ²éѯ³£³£ÊÇÓÐÏ޵ġ£Batch
LayerÐèÒª×öµÄÒ»¼þÖØÒªµÄ¹¤×÷¾ÍÊǸù¾ÝÒµÎñµÄÐèÇ󣬿¼²ì¿ÉÄÜÐèÒªµÄ¸÷ÖÖ²éѯ£¬¸ù¾Ý²éѯ¶¨ÒåÆäÔÚÊý¾Ý¼¯É϶ÔÓ¦µÄViews¡£
4.2.Speed Layer
Batch Layer¿ÉÒԺܺõĴ¦ÀíÀëÏßÊý¾Ý£¬µ«Óкܶೡ¾°Êý¾Ý²»¶ÏʵʱÉú³É£¬²¢ÇÒÐèҪʵʱ²éѯ´¦Àí¡£Speed
LayerÕýÊÇÓÃÀ´´¦ÀíÔöÁ¿µÄʵʱÊý¾Ý¡£
Speed LayerºÍBatch Layer±È½ÏÀàËÆ£¬¶ÔÊý¾Ý½øÐмÆËã²¢Éú³ÉRealtime View£¬ÆäÖ÷񻂿±ðÔÚÓÚ£º
Speed Layer´¦ÀíµÄÊý¾ÝÊÇ×î½üµÄÔöÁ¿Êý¾ÝÁ÷£¬Batch Layer´¦ÀíµÄÈ«ÌåÊý¾Ý¼¯
Speed LayerΪÁËЧÂÊ£¬½ÓÊÕµ½ÐÂÊý¾Ýʱ²»¶Ï¸üÐÂRealtime View£¬¶øBatch Layer¸ù¾ÝÈ«ÌåÀëÏßÊý¾Ý¼¯Ö±½ÓµÃµ½Batch
View¡£
Lambda¼Ü¹¹½«Êý¾Ý´¦Àí·Ö½âΪBatch LayerºÍSpeed LayerÓÐÈçÏÂÓŵ㣺
ÈÝ´íÐÔ¡£Speed LayerÖд¦ÀíµÄÊý¾ÝÒ²²»¶ÏдÈëBatch Layer£¬µ±Batch LayerÖÐÖØÐ¼ÆËãµÄÊý¾Ý¼¯°üº¬Speed
Layer´¦ÀíµÄÊý¾Ý¼¯ºó£¬µ±Ç°µÄRealtime View¾Í¿ÉÒÔ¶ªÆú£¬ÕâÒ²¾ÍÒâζ×ÅSpeed Layer´¦ÀíÖÐÒýÈëµÄ´íÎó£¬ÔÚBatch
LayerÖØÐ¼ÆËãʱ¶¼¿ÉÒԵõ½ÐÞÕý¡£ÕâµãÒ²¿ÉÒÔ¿´³ÉÊÇCAPÀíÂÛÖеÄ×îÖÕÒ»ÖÂÐÔ£¨Eventual Consistency£©µÄÌåÏÖ¡£
¸´ÔÓÐÔ¸ôÀë¡£Batch Layer´¦ÀíµÄÊÇÀëÏßÊý¾Ý£¬¿ÉÒԺܺõÄÕÆ¿Ø¡£Speed Layer²ÉÓÃÔöÁ¿Ëã·¨´¦ÀíʵʱÊý¾Ý£¬¸´ÔÓÐÔ±ÈBatch
LayerÒª¸ßºÜ¶à¡£Í¨¹ý·Ö¿ªBatch LayerºÍSpeed Layer£¬°Ñ¸´ÔÓÐÔ¸ôÀëµ½Speed Layer£¬¿ÉÒԺܺõÄÌá¸ßÕû¸öϵͳµÄ³°ôÐԺͿɿ¿ÐÔ¡£
4.3.Serving Layer
Lambda¼Ü¹¹µÄServing LayerÓÃÓÚÏìÓ¦Óû§µÄ²éѯÇëÇ󣬺ϲ¢Batch ViewºÍRealtime
ViewÖеĽá¹ûÊý¾Ý¼¯µ½×îÖÕµÄÊý¾Ý¼¯¡£
Õâ¶ùÉæ¼°µ½Êý¾ÝÈçºÎºÏ²¢µÄÎÊÌâ¡£Ç°ÃæÎÒÃÇÌÖÂÛÁ˲éѯº¯ÊýµÄMonoidÐÔÖÊ£¬Èç¹û²éѯº¯ÊýÂú×ãMonoidÐÔÖÊ£¬¼´Âú×ã½áºÏÂÊ£¬Ö»ÐèÒª¼òµ¥µÄºÏ²¢Batch
ViewºÍRealtime ViewÖеĽá¹ûÊý¾Ý¼¯¼´¿É¡£·ñÔòµÄ»°£¬¿ÉÒ԰Ѳéѯº¯Êýת»»³É¶à¸öÂú×ãMonoidÐÔÖʵIJéѯº¯ÊýµÄÔËË㣬µ¥¶À¶Ôÿ¸öÂú×ãMonoidÐÔÖʵIJéѯº¯Êý½øÐÐBatch
ViewºÍRealtime ViewÖеĽá¹ûÊý¾Ý¼¯ºÏ²¢£¬È»ºóÔÙ¼ÆËãµÃµ½×îÖյĽá¹ûÊý¾Ý¼¯¡£ÁíÍâÒ²¿ÉÒÔ¸ù¾ÝÒµÎñ×ÔÉíµÄÌØÐÔ£¬ÔËÓÃÒµÎñ×ÔÉíµÄ¹æÔòÀ´¶ÔBatch
ViewºÍRealtime ViewÖеĽá¹ûÊý¾Ý¼¯ºÏ²¢¡£
5.Big Picture
ÉÏÃæ·Ö±ðÌÖÂÛÁËLambda¼Ü¹¹µÄÈý²ã£ºBatch Layer£¬Speed LayerºÍServing Layer¡£ÏÂͼ¸ø³öÁËLambda¼Ü¹¹µÄÒ»¸öÍêÕûÊÓͼºÍÁ÷³Ì¡£
Êý¾ÝÁ÷½øÈëϵͳºó£¬Í¬Ê±·¢ÍùBatch LayerºÍSpeed Layer´¦Àí¡£Batch LayerÒÔ²»¿É±äÄ£ÐÍÀëÏß´æ´¢ËùÓÐÊý¾Ý¼¯£¬Í¨¹ýÔÚÈ«ÌåÊý¾Ý¼¯Éϲ»¶ÏÖØÐ¼ÆËã¹¹½¨²éѯËù¶ÔÓ¦µÄBatch
Views¡£Speed Layer´¦ÀíÔöÁ¿µÄʵʱÊý¾ÝÁ÷£¬²»¶Ï¸üвéѯËù¶ÔÓ¦µÄRealtime Views¡£Serving
LayerÏìÓ¦Óû§µÄ²éѯÇëÇ󣬺ϲ¢Batch ViewºÍRealtime ViewÖеĽá¹ûÊý¾Ý¼¯µ½×îÖÕµÄÊý¾Ý¼¯¡£
5.1.Lambda¼Ü¹¹×é¼þÑ¡ÐÍ
ÏÂͼ¸ø³öÁËLambda¼Ü¹¹Öи÷¸ö²ã³£ÓõÄ×é¼þ¡£Êý¾ÝÁ÷´æ´¢¿ÉÑ¡ÓûùÓÚ²»¿É±äÈÕÖ¾µÄ·Ö²¼Ê½ÏûϢϵͳKafka£»Batch
LayerÊý¾Ý¼¯µÄ´æ´¢¿ÉÑ¡ÓÃHadoopµÄHDFS£¬»òÕßÊǰ¢ÀïÔÆµÄODPS£»Batch ViewµÄÔ¤¼ÆËã¿ÉÒÔÑ¡ÓÃMapReduce»òSpark£»Batch
View×ÔÉí½á¹ûÊý¾ÝµÄ´æ´¢¿ÉʹÓÃMySQL£¨²éѯÉÙÁ¿µÄ×î½ü½á¹ûÊý¾Ý£©£¬»òHBase£¨²éѯ´óÁ¿µÄÀúÊ·½á¹ûÊý¾Ý£©¡£Speed
LayerÔöÁ¿Êý¾ÝµÄ´¦Àí¿ÉÑ¡ÓÃStorm»òSpark Streaming£»Realtime ViewÔöÁ¿½á¹ûÊý¾Ý¼¯ÎªÁËÂú×ãʵʱ¸üеÄЧÂÊ£¬¿ÉÑ¡ÓÃRedisµÈÄÚ´æNoSQL¡£
5.2.Lambda¼Ü¹¹×é¼þÑ¡ÐÍÔÔò
Lambda¼Ü¹¹ÊǸöͨÓÿò¼Ü£¬¸÷¸ö²ãÑ¡ÐÍʱ²»Òª¾ÖÏÞʱÉÏÃæ¸ø³öµÄ×é¼þ£¬ÌرðÊǶÔÓÚViewµÄÑ¡ÐÍ¡£´ÓÎÒ¶ÔLambda¼Ü¹¹µÄʵ¼ùÀ´¿´£¬ÒòΪViewÊǸöºÍÒµÎñ¹ØÁªÐԷdz£´óµÄ¸ÅÄViewÑ¡Ôñ×é¼þʱ¹Ø¼üÊÇÒª¸ù¾ÝÒµÎñµÄÐèÇó£¬À´Ñ¡Ôñ×îÊʺϲéѯµÄ×é¼þ¡£²»Í¬µÄView×é¼þµÄÑ¡ÔñÒªÉîÈëÍÚ¾òÊý¾ÝºÍ¼ÆËã×ÔÉíµÄÌØµã£¬´Ó¶øÑ¡Ôñ³ö×îÊʺÏÊý¾ÝºÍ¼ÆËã×ÔÉíÌØµãµÄ×é¼þ£¬Í¬Ê±²»Í¬µÄView¿ÉÒÔÑ¡Ôñ²»Í¬µÄ×é¼þ¡£
6.Lambda¼Ü¹¹ vs. Event Sourcing vs. CQRS
ÔÚLambda¼Ü¹¹ÉíÉÏ¿ÉÒÔ¿´µ½ºÜ¶àÏÖÓÐÉè¼ÆË¼ÏëºÍ¼Ü¹¹µÄÓ°×Ó£¬ÈçEvent SourcingºÍCQRS£¬Õâ¶ùÎÒÃǰÑËüÃǺÍLambda¼Ü¹¹×öÒ»½áºÏ¶Ô±È£¬´Ó¶øÈ¥¸üÉîÈëµÄÀí½âLambda¼Ü¹¹¡£
6.1.ʼþËÝÔ´£¨Event Sourcing£©vs. Lambda¼Ü¹¹
ʼþËÝÔ´£¨Event Sourcing£©ÊÇÓÉ´óÃû¶¦¶¦µÄMartin Flower´óÊåÌá³öÀ´µÄ¼Ü¹¹Ä£Ê½¡£Event
Sourcing±¾ÖÊÉÏÊÇÒ»ÖÖÊý¾Ý³Ö¾Ã»¯µÄ·½Ê½£¬Ëü½«Òý·¢±ä»¯µÄʼþ£¨Event£©±¾Éí´æ´¢ÏÂÀ´¡£Ïà±ÈÓÚ´«Í³Êý¾ÝÊdz־û¯·½Ê½£¬´æ´¢µÄÊÇʼþÒý·¢µÄ½á¹û£¬¶ø·Çʼþ±¾Éí£¬ÕâÑùÎÒÃÇÔÚ±£´æ½á¹ûµÄͬʱ£¬Êµ¼ÊÉÏʧȥÁË×·Ëݵ¼Ö½á¹ûÔÒòµÄ»ú»á¡£
Õâ¶ù¿ÉÒÔ¿´µ½Lambda¼Ü¹¹ÖÐÊý¾Ý¼¯µÄ´æ´¢ºÍEvent SourcingÖеÄ˼ÏëÊÇÍêȫһֵ쬱¾Öʶ¼ÊDzÉÓò»¿É±äµÄÊý¾ÝÄ£ÐÍ´æ´¢Òý·¢±ä»¯µÄʼþ¶ø·Ç±ä»¯²úÉúµÄ½á¹û¡£´Ó¶øÔÚ·¢Éú´íÎóµÄʱºò£¬Äܹ»×·±¾ËÝÔ´£¬ÕÒµ½·¢Éú´íÎóµÄ¸ùÔ´£¬Í¨¹ýÖØÐ¼ÆË㶪Æú´íÎóµÄÐÅÏ¢À´»Ö¸´ÏµÍ³£¬´ïµ½ÏµÍ³µÄÈÝ´íÐÔ¡£
6.2.CQRS vs. Lambda¼Ü¹¹
CQRS (Command Query Responsibility Segregation)½«¶ÔÊý¾ÝµÄÐ޸IJÙ×÷ºÍ²éѯ²Ù×÷·ÖÀ룬Æä±¾ÖʺÍLambda¼Ü¹¹Ò»Ñù£¬Ò²ÊÇÒ»ÖÖÐÎʽµÄ¶Áд·ÖÀë¡£ÔÚLambda¼Ü¹¹ÖУ¬Êý¾ÝÒÔ²»¿É±äµÄ·½Ê½´æ´¢ÏÂÀ´£¨Ð´²Ù×÷£©£¬×ª»»³É²éѯËù¶ÔÓ¦µÄViews£¬²éѯ´ÓViewÖÐÖ±½ÓµÃµ½½á¹ûÊý¾Ý£¨¶Á²Ù×÷£©¡£
¶Áд·ÖÀ뽫¶ÁºÍдÁ½¸öÊӽǽøÐзÖÀ룬´øÀ´µÄºÃ´¦ÊǸ´ÔÓÐԵĸôÀ룬´Ó¶ø¼ò»¯ÏµÍ³µÄÉè¼Æ¡£Ïà±ÈÓÚ´«Í³×ö·¨ÖеĽ«¶ÁºÍд²Ù×÷·ÅÔÚÒ»ÆðµÄ´¦Àí·½Ê½£¬¶ÔÓÚ¶Áд²Ù×÷ÒµÎñ·Ç³£¸´ÔÓµÄϵͳ£¬Ö»»áʹϵͳ±äµÃÒì³£¸´ÔÓ£¬ÄÑÒÔά»¤¡£
7.×ܽá
±¾ÎĽéÉÜÁËLambda¼Ü¹¹µÄ»ù±¾¸ÅÄî¡£Lambda¼Ü¹¹Í¨¹ý¶ÔÊý¾ÝºÍ²éѯµÄ±¾ÖÊÈÏʶ£¬ÈÚºÏÁ˲»¿É±äÐÔ£¨Immunability£©£¬¶Áд·ÖÀëºÍ¸´ÔÓÐÔ¸ôÀëµÈһϵÁмܹ¹ÔÔò£¬½«´óÊý¾Ý´¦Àíϵͳ»®·ÖΪBatch
Layer, Speed LayerºÍServing LayerÈý²ã£¬´Ó¶øÉè¼Æ³öÒ»¸öÄÜÂú×ãʵʱ´óÊý¾Ýϵͳ¹Ø¼üÌØÐÔ£¨Èç¸ßÈÝ´í¡¢µÍÑÓʱºÍ¿ÉÀ©Õ¹µÈ£©µÄ¼Ü¹¹¡£Lambda¼Ü¹¹×÷Ϊһ¸öͨÓõĴóÊý¾Ý´¦Àí¿ò¼Ü£¬¿ÉÒԺܷ½±ãµÄ¼¯³ÉHadoop£¬Kafka£¬Storm£¬Spark£¬HbaseµÈ¸÷Àà´óÊý¾Ý×é¼þ¡£ |