
1.1 ·Ö²¼Ê½Êý¾Ý¹ÜÀí֮ʹµã
ΪÁËÈ·±£Î¢·þÎñÖ®¼äËÉñîºÏ£¬Ã¿¸ö·þÎñ¶¼ÓÐ×Ô¼ºµÄÊý¾Ý¿â, ÓеÄÊǹØÏµÐÍÊý¾Ý¿â(SQL)£¬ÓеÄÊǷǹØÏµÐÍÊý¾Ý¿â(NoSQL)¡£
¿ª·¢ÆóÒµÊÂÎñÍùÍùÇ£Éæµ½¶à¸ö·þÎñ£¬ÒªÏë×öµ½¶à¸ö·þÎñÊý¾ÝµÄÒ»ÖÂÐÔ²¢·ÇÒ×Ê£¬Í¬Ñù£¬ÔÚ¶à¸ö·þÎñÖ®¼ä½øÐÐÊý¾Ý²éѯҲ³äÂúÌôÕ½¡£
ÎÒÃÇÒÔÒ»¸öÔÚÏßB2BÉ̵êΪÀý£¬¿Í»§·þÎñ °üÀ¨Á˿ͻ§µÄ¸÷ÖÖÐÅÏ¢£¬ÀýÈç¿ÉÓÃÐÅÓõȡ£
¹ÜÀí¶©µ¥£¬Ìṩ¶©µ¥·þÎñ£¬ÔòÐèÒªÑé֤ij¸öж©µ¥Óë¿Í»§µÄÐÅÓÃÏÞÖÆÃ»ÓгåÍ»¡£
ÔÚµ¥ÌåÓ¦ÓÃÖУ¬¶©µ¥·þÎñÖ»ÐèҪʹÓô«Í³ÊÂÎñ½»Ò׾ͿÉÒÔÒ»´ÎÐÔ¼ì²é¿ÉÓÃÐÅÓúʹ´½¨¶©µ¥¡£
Ï෴΢·þÎñ¼Ü¹¹Ï£¬¶©µ¥ºÍ¿Í»§±í·Ö±ðÊÇÏàÓ¦·þÎñµÄ˽ÓÐ±í£¬ÈçÏÂͼËùʾ£º

¶©µ¥·þÎñ²»ÄÜÖ±½Ó·ÃÎʿͻ§±í£¬Ö»ÄÜͨ¹ý¿Í»§·þÎñ·¢²¼µÄAPIÀ´·ÃÎÊ»òÕßʹÓ÷ֲ¼Ê½ÊÂÎñ,
Ò²¾ÍÊÇÖÚËùÖÜÖªµÄÁ½½×¶ÎÌá½» (2PC)À´·ÃÎʿͻ§±í£¬2PCÒâÒåͼÈçÏÂËùʾ£º

ÕâÀï´æÔÚÁ½¸öÌôÕ½£¬µÚÒ»¸öÌôÕ½ÊÇ2PC³ýÒªÇóÊý¾Ý¿â±¾ÉíÖ§³ÖÍ⣬»¹ÒªÇó·þÎñµÄÊý¾Ý¿âÀàÐÍÐèÒª±£³ÖÒ»Ö¡£
µ«ÊÇÏÖÔÚµÄ΢·þÎñ¼Ü¹¹ÖУ¬Ã¿¸ö·þÎñµÄÊý¾Ý¿âÀàÐÍ¿ÉÄÜÊDz»Ò»ÑùµÄ£¬ÓеĿÉÄÜÊÇMySQLÊý¾Ý¿â£¬ÓеÄÒ²¿ÉÄÜÊÇNoSQLÊý¾Ý¿â;
µÚ¶þ¸öÌôÕ½ÊÇÈçºÎʵÏÖ´Ó¶à¸ö·þÎñÖвéѯÊý¾Ý¡£¼ÙÉèÓ¦ÓóÌÐòÐèÒªÏÔʾһ¸ö¿Í»§ºÍËû×î½üµÄ¶©µ¥¡£Èç¹û¶©µ¥·þÎñÌṩÓÃÓÚ¼ìË÷¿Í»§¶©µ¥µÄAPI£¬ÄÇôӦÓóÌÐò¶Ë¿ÉÒÔͨ¹ýJOIN·½Ê½À´¼ìË÷´ËÊý¾Ý£¬¼´Ó¦ÓóÌÐòÊ×Ñ¡´Ó¿Í»§·þÎñ¼ìË÷¿Í»§£¬²¢´Ó¶©µ¥·þÎñ¼ìË÷¿Í»§µÄ¶©µ¥¡£
È»¶ø£¬Èç¹û¶©µ¥·þÎñ½öÖ§³Öͨ¹ýÆäÖ÷¼ü²éÕÒ¶©µ¥(Ò²ÐíËüʹÓýöÖ§³Ö»ùÓÚÖ÷¼üµÄ¼ìË÷µÄNoSQLÊý¾Ý¿â)£¬
ÔÚÕâÖÖÇé¿öÏ£¬¾ÍûÓз½·¨À´¼ìË÷²éѯËùÐèµÄÊý¾Ý¡£
Ϊ½â¾öÕâÁ½´óÍ´µã£¬¾ÍÐèÒªÎÒÃÇʹÓõ½·Ö²½Ê½Êý¾Ý¹ÜÀíÁË¡£
1.2 ·Ö²¼Ê½Êý¾Ý¹ÜÀíÖ®¾Ù´ë
ÔÚ½éÉÜ·Ö²¼Ê½Êý¾Ý¹ÜÀí(CRUD)½â¾ö·½°¸Ö®Ç°£¬ÓбØÒª½éÉÜÏÂCAPÔÀíºÍ×îÖÕÒ»ÖÂÐÔÏà¹Ø¸ÅÄî¡£
1.2.1 CAPÔÀíºÍ×îÖÕÒ»ÖÂÐÔ
1.2.1.1 CAPÔÀí(CAP Theorem)
ÔÚ×ãÇò±ÈÈüÀһ¸öÇòÔ±ÔÚÒ»³¡±ÈÈüÖнøÈý¸öÇò£¬³ÆÖ®ÎªÃ±×ÓÏ··¨(Hat-trick)¡£ÔÚ·Ö²¼Ê½Êý¾ÝϵͳÖУ¬Ò²ÓÐÒ»¸öñ×ÓÔÀí(CAP
Theorem)£¬²»¹ý´Ëñ×ӷDZËñ×Ó¡£CAPÔÀíÖУ¬ÓÐÈý¸öÒªËØ£º
1)Ò»ÖÂÐÔ(C onsistency)
2)¿ÉÓÃÐÔ(A vailability)
3)·ÖÇøÈÝÈÌÐÔ(P artition tolerance)
CAPÔÀíÖ¸µÄÊÇ£¬ÕâÈý¸öÒªËØ×î¶àÖ»ÄÜͬʱʵÏÖÁ½µã£¬²»¿ÉÄÜÈýÕß¼æ¹Ë¡£
Òò´ËÔÚ½øÐзֲ¼Ê½¼Ü¹¹Éè¼ÆÊ±£¬±ØÐë×ö³öÈ¡Éá¡£¶ø¶ÔÓÚ·Ö²¼Ê½Êý¾Ýϵͳ£¬·ÖÇøÈÝÈÌÐÔÊÇ»ù±¾ÒªÇó
£¬·ñÔò¾ÍʧȥÁ˼ÛÖµ£¬Òò´ËÉè¼Æ·Ö²¼Ê½Êý¾Ýϵͳ£¬¾ÍÊÇÔÚÒ»ÖÂÐԺͿÉÓÃÐÔÖ®¼äȡһ¸öƽºâ¡£
¶ÔÓÚ´ó¶àÊýwebÓ¦ Óã¬Æäʵ²¢²»ÐèҪǿһÖÂÐÔ£¬Òò´ËÎþÉüÒ»ÖÂÐÔ¶ø»»È¡¸ß¿ÉÓÃÐÔ£¬ÊÇĿǰ¶àÊý·Ö²¼Ê½Êý¾Ý¿â²úÆ·µÄ·½Ïò¡£
µ±È»£¬ÎþÉüÒ»ÖÂÐÔ£¬²¢²»ÊÇÍêÈ«²»¹ÜÊý¾ÝµÄÒ»ÖÂÐÔ£¬·ñÔòÊý¾ÝÊÇ»ìÂҵģ¬ÄÇôϵͳ¿ÉÓÃÐÔÔٸ߷ֲ¼Ê½ÔÙºÃҲûÓÐÁ˼ÛÖµ¡£
ÎþÉüÒ»ÖÂÐÔ£¬Ö»ÊDz»ÔÙÒªÇó¹ØÏµÐÍÊý ¾Ý¿âÖеÄǿһÖÂÐÔ£¬¶øÊÇֻҪϵͳÄÜ´ïµ½×îÖÕÒ»ÖÂÐÔ¼´¿É£¬¿¼Âǵ½¿Í»§ÌåÑ飬Õâ¸ö×îÖÕÒ»ÖµÄʱ¼ä´°¿Ú£¬Òª¾¡¿ÉÄܵĶÔÓû§Í¸Ã÷£¬Ò²¾ÍÊÇÐèÒª±£ÕÏ¡°Óû§¸ÐÖªµ½µÄÒ»ÖÂÐÔ¡±¡£
ͨ³£ÊÇͨ¹ýÊý¾ÝµÄ¶à·ÝÒì²½¸´ÖÆÀ´ÊµÏÖϵͳµÄ¸ß¿ÉÓúÍÊý¾ÝµÄ×îÖÕÒ»ÖÂÐԵ쬡°Óû§¸ÐÖªµ½µÄÒ»ÖÂÐÔ¡±µÄʱ¼ä´°¿ÚÔò
È¡¾öÓÚÊý¾Ý¸´ÖƵ½Ò»ÖÂ״̬µÄʱ¼ä¡£
1.2.1.2 ×îÖÕÒ»ÖÂÐÔ(eventually consistent)
¶ÔÓÚÒ»ÖÂÐÔ£¬¿ÉÒÔ·ÖΪ´Ó¿Í»§¶ËºÍ·þÎñ¶ËÁ½¸ö²»Í¬µÄÊӽǡ£
´Ó¿Í»§¶ËÀ´¿´£¬Ò»ÖÂÐÔÖ÷ÒªÖ¸µÄÊǶಢ·¢·ÃÎÊʱ¸üйýµÄÊý¾ÝÈçºÎ»ñÈ¡µÄÎÊÌâ¡£
´Ó·þÎñ¶ËÀ´¿´£¬ÔòÊǸüÐÂÈçºÎ¸´ÖÆ·Ö²¼µ½Õû¸öϵͳ£¬ÒÔ±£Ö¤Êý¾Ý×îÖÕÒ»Ö¡£
Ò»ÖÂÐÔÊÇÒòΪÓв¢·¢¶Áд²ÅÓеÄÎÊÌ⣬Òò´ËÔÚÀí½âÒ»ÖÂÐÔµÄÎÊÌâʱ£¬Ò»¶¨Òª×¢Òâ½áºÏ¿¼ÂDz¢·¢¶ÁдµÄ³¡¾°¡£
´Ó¿Í»§¶Ë½Ç¶È£¬¶à½ø³Ì²¢·¢·ÃÎÊʱ£¬¸üйýµÄÊý¾ÝÔÚ²»Í¬½ø³ÌÈçºÎ»ñÈ¡µÄ²»Í¬²ßÂÔ£¬¾ö¶¨Á˲»Í¬µÄÒ»ÖÂÐÔ¡£
¶ÔÓÚ¹ØÏµÐÍÊý¾Ý¿â£¬ÒªÇó¸üйýµÄÊý¾ÝÄܱ»ºóÐøµÄ ·ÃÎʶ¼ÄÜ¿´µ½£¬ÕâÊÇǿһÖÂÐÔ
;Èç¹ûÄÜÈÝÈ̺óÐøµÄ²¿·Ö»òÕßÈ«²¿·ÃÎʲ»µ½£¬ÔòÊÇÈõÒ»ÖÂÐÔ ; Èç¹û¾¹ýÒ»¶Îʱ¼äºóÒªÇóÄÜ·ÃÎʵ½¸üкóµÄÊý¾Ý£¬ÔòÊÇ×îÖÕÒ»ÖÂÐÔ¡£
´Ó·þÎñ¶Ë½Ç¶È£¬ÈçºÎ¾¡¿ì½«¸üкóµÄÊý¾Ý·Ö²¼µ½Õû¸öϵͳ£¬½µµÍ´ïµ½×îÖÕÒ»ÖÂÐÔµÄʱ¼ä´°¿Ú£¬ÊÇÌá¸ßϵͳµÄ¿ÉÓöȺÍÓû§ÌåÑé·Ç³£ÖØÒªµÄ·½Ãæ¡£
ÄÇôÎÊÌâÀ´ÁË£¬ÈçºÎʵÏÖÊý¾ÝµÄ×îÖÕÒ»ÖÂÐÔÄØ?´ð°¸¾ÍÔÚʼþÇý¶¯¼Ü¹¹¡£
1.2.2 ʼþÇý¶¯¼Ü¹¹¼ò½é
Chris Richardson×÷Ϊ΢·þÎñ¼Ü¹¹Éè¼ÆÁìÓòµÄȨÍþ£¬¸ø³öÁË·Ö²¼Ê½Êý¾Ý¹ÜÀíµÄ×î¼Ñ½â¾ö·½°¸¡£
¶ÔÓÚ´ó¶àÊýÓ¦ÓöøÑÔ£¬ÒªÊµÏÖ΢·þÎñµÄ·Ö²¼Ê½Êý¾Ý¹ÜÀí£¬ÐèÒª²ÉÓÃʼþÇý¶¯¼Ü¹¹(event-driven
architecture)¡£
ÔÚʼþÇý¶¯¼Ü¹¹ÖУ¬µ±Ä³¼þÖØÒªÊÂÇé·¢Éúʱ£¬Î¢·þÎñ»á·¢²¼Ò»¸öʼþ£¬ÀýÈç¸üÐÂÒ»¸öÒµÎñʵÌå¡£
µ±¶©ÔÄÕâЩʼþµÄ΢·þÎñ½ÓÊÕ´Ëʼþʱ£¬¾Í¿ÉÒÔ¸üÐÂ×Ô¼ºµÄÒµÎñʵÌ壬Ҳ¿ÉÄÜ»áÒý·¢¸ü¶àµÄʼþ·¢²¼£¬ÈÃÆäËûÏà¹Ø·þÎñ½øÐÐÊý¾Ý¸üУ¬×îÖÕʵÏÖ·Ö²¼Ê½Êý¾Ý×îÖÕÒ»ÖÂÐÔ¡£
¿ÉÒÔʹÓÃʼþÀ´ÊµÏÖ¿ç¶à·þÎñµÄÒµÎñ½»Òס£½»Ò×Ò»°ãÓÉһϵÁв½Öè¹¹³É£¬Ã¿Ò»²½Öè¶¼ÓÉÒ»¸ö¸üÐÂÒµÎñʵÌåµÄ΢·þÎñºÍ·¢²¼¼¤»îÏÂÒ»²½ÖèµÄʼþ¹¹³É¡£
1.2.2.1 ʼþÇý¶¯Ê¾Àý1
ÏÂͼչÏÖÈçºÎʹÓÃʼþÇý¶¯·½·¨£¬ÔÚ´´½¨¶©µ¥Ê±¼ì²éÐÅÓÿÉÓöȣ¬Î¢·þÎñÖ®¼äͨ¹ýÏûÏ¢´úÀí(Messsage
Broker)À´½»»»Ê¼þ¡£
1. ¶©µ¥·þÎñ´´½¨Ò»¸ö´øÓÐNEW״̬µÄOrder (¶©µ¥)£¬·¢²¼ÁËÒ»¸ö¡°Order
Created Event(´´½¨¶©µ¥)¡±µÄʼþ¡£

2. ¿Í»§·þÎñ Ïû·ÑOrder Created Eventʼþ£¬Îª´Ë¶©µ¥Ô¤ÁôÐÅÓ㬷¢²¼¡°Credit
Reserved Event(ÐÅÓÃÔ¤Áô)¡±Ê¼þ¡£

3. ¶©µ¥·þÎñÏû·ÑCredit Reserved Event£¬¸Ä±ä¶©µ¥µÄ״̬ΪOPEN¡£

1.2.2.2 ʼþÇý¶¯Ê¾Àý2
ÏÂͼչÏÖÈçºÎʹÓÃʼþÇý¶¯·½·¨£¬ÔÚ´´½¨¶©µ¥Ê±´¥·¢Ö§¸¶ÒµÎñµÄÊý¾Ý¸üУ¬Î¢·þÎñÖ®¼äͨ¹ýÏûÏ¢´úÀí(Messsage
Broker)À´½»»»Ê¼þ¡£
1. ¶©µ¥·þÎñ´´½¨Ò»¸ö´ýÖ§¸¶µÄ¶©µ¥£¬·¢²¼Ò»¸ö¡°´´½¨¶©µ¥¡±µÄʼþ¡£
2. Ö§¸¶·þÎñÏû·Ñ¡°´´½¨¶©µ¥¡±Ê¼þ£¬Ö§¸¶Íê³Éºó·¢²¼Ò»¸ö¡°Ö§¸¶Íê³É¡±Ê¼þ¡£

3. ¶©µ¥·þÎñÏû·Ñ¡°Ö§¸¶Íê³É¡±Ê¼þ£¬¶©µ¥×´Ì¬¸üÐÂΪ´ý³ö¿â¡£

1.2.3 ʼþÇý¶¯¼Ü¹¹Ö®·Ö²¼Ê½Êý¾Ý¸üÐÂ
ÉϽÚͨ¹ýʾÀý¸ÅÒª½éÉÜÁËͨ¹ýʼþÇý¶¯·½Ê½£¬ÊµÏÖÁË·Ö²¼Ê½Êý¾Ý×îÖÕÒ»ÖÂÐÔ±£Ö¤¡£×ݹÛ΢·þÎñ¼Ü¹¹ÏµÄʼþÇý¶¯ÒµÎñ´¦ÀíÂß¼£¬ÆäºËÐÄÒªµãÔÚÓÚ£¬¿É¿¿µÄʼþͶµÝºÍ±ÜÃâʼþµÄÖØ¸´Ïû·Ñ¡£
¿É¿¿Ê¼þͶµÝÓÐÒÔÏÂÁ½¸öÌØÐÔ£º
1) ÿ¸ö·þÎñÔ×ÓÐÔµÄÍê³ÉÒµÎñ²Ù×÷ºÍ·¢²¼Ê¼þ;
2) ÏûÏ¢´úÀíÈ·±£Ê¼þͶµÝÖÁÉÙÒ»´Î(at least once);
¶ø±ÜÃâʼþÖØ¸´Ïû·ÑÔòÒªÇóÏû·ÑʼþµÄ·þÎñʵÏÖÃݵÈÐÔ£¬±ÈÈçÖ§¸¶·þÎñ²»ÄÜÒòÎªÖØ¸´ÊÕµ½Ê¼þ¶ø¶à´ÎÖ§¸¶¡£
BTW£ºµ±Ç°Á÷ÐеÄÏûÏ¢¶ÓÁÐÈçKafkaµÈ£¬¶¼ÒѾʵÏÖÁËʼþµÄ³Ö¾Ã»¯ºÍat
least onceµÄͶµÝģʽ£¬ËùÒÔ¿É¿¿Ê¼þͶµÝµÄµÚ¶þÌõÌØÐÔÒѾÂú×㣬ÕâÀï¾Í²»Õ¹¿ª¡£½ÓÏÂÀ´Õ½ڽ²Öص㽲ÊöÈçºÎʵÏÖ¿É¿¿Ê¼þͶµÝµÄµÚÒ»ÌõÌØÐԺͱÜÃâʼþÖØ¸´Ïû·Ñ£¬¼´·þÎñµÄÒµÎñ²Ù×÷ºÍ·¢²¼Ê¼þµÄÔ×ÓÐԺͱÜÃâÏû·ÑÕßÖØ¸´Ïû·ÑʼþÒªÇó·þÎñʵÏÖÃݵÈÐÔ¡£
1.2.3.1 ÈçºÎʵÏÖʼþͶµÝ²Ù×÷Ô×ÓÐÔ?
ʼþÇý¶¯¼Ü¹¹»áÅöµ½Êý¾Ý¿â¸üкͷ¢²¼Ê¼þÔ×ÓÐÔÎÊÌâ¡£ÀýÈ磬¶©µ¥·þÎñ±ØÐëÏòORDER±í²åÈëÒ»ÐУ¬È»ºó·¢²¼Order
Created event£¬ÕâÁ½¸ö²Ù×÷ÐèÒªÔ×ÓÐÔ¡£±ÈÈç¸üÐÂÊý¾Ý¿âºó£¬·þÎṉ̃ÁË(crashes)Ôì³ÉʼþδÄÜ·¢²¼£¬ÏµÍ³±ä³É²»Ò»ÖÂ״̬¡£ÄÇôÈçºÎʵÏÖ·þÎñµÄÒµÎñ²Ù×÷ºÍ·¢²¼Ê¼þµÄÔ×ÓÐÔÄØ?
1.2.3.1.1 ʹÓñ¾µØÊÂÎñ·¢²¼Ê¼þ
»ñµÃÔ×ÓÐÔµÄÒ»¸ö·½·¨Êǽ«·þÎñµÄÒµÎñ²Ù×÷ºÍ·¢²¼Ê¼þ·ÅÔÚÒ»¸ö±¾µØÊý¾Ý¿âÊÂÎñÀҲ¾ÍÊÇ˵£¬ÐèÒªÔÚ±¾µØ½¨Á¢Ò»¸öEVENT±í£¬´Ë±íÔÚ´æ´¢ÒµÎñʵÌåÊý¾Ý¿âÖÐÆðµ½ÏûÏ¢ÁÐ±í¹¦ÄÜ¡£µ±Ó¦Ó÷¢ÆðÒ»¸ö(±¾µØ)Êý¾Ý¿â½»Ò×£¬¸üÐÂÒµÎñʵÌå״̬ʱ£¬»áÏòEVENT±íÖвåÈëÒ»¸öʼþ£¬È»ºóÌá½»´Ë´Î½»Òס£ÁíÍâÒ»¸ö¶ÀÁ¢Ó¦Óýø³Ì»òÕßÏ̲߳éѯ´ËEVENT±í£¬ÏòÏûÏ¢´úÀí·¢²¼Ê¼þ£¬È»ºóʹÓñ¾µØ½»Ò×±êÖ¾´ËʼþΪÒÑ·¢²¼£¬ÈçÏÂͼËùʾ£º

¶©µ¥·þÎñÏòORDER±í²åÈëÒ»ÐУ¬È»ºóÏòEVENT±íÖвåÈëOrder
Created event£¬Ê¼þ·¢²¼Ï̻߳òÕß½ø³Ì²éѯEVENT±í£¬ÇëÇóδ·¢²¼Ê¼þ£¬·¢²¼ËûÃÇ£¬È»ºó¸üÐÂEVENT±í±êÖ¾´ËʼþΪÒÑ·¢²¼¡£
´Ë·½·¨Ò²ÊÇÓÅȱµã¶¼ÓС£ÓŵãÊÇ¿ÉÒÔÈ·±£Ê¼þ·¢²¼²»ÒÀÀµÓÚ2PC£¬Ó¦Ó÷¢²¼ÒµÎñ²ã¼¶Ê¼þ¶ø²»ÐèÒªÍÆ¶ÏËûÃÇ·¢ÉúÁËʲô;¶øÈ±µãÔÚÓÚ´Ë·½·¨ÓÉÓÚ¿ª·¢ÈËÔ±±ØÐëÀμǷ¢²¼Ê¼þ£¬Òò´ËÓпÉÄܳöÏÖ´íÎó¡£
1.2.3.1.2 ʹÓÃʼþÔ´
Event sourcing (ʼþÔ´)ͨ¹ýʹÓÃÒÔʼþÖÐÐĵÄÊý¾Ý´æ´¢·½Ê½À´±£Ö¤ÒµÎñʵÌåµÄÒ»ÖÂÐÔ¡£Ê¼þÔ´±£´æÁËÿ¸öÒµÎñʵÌåËùÓÐ״̬±ä»¯µÄʼþ£¬¶ø²»ÊǴ洢ʵÌ嵱ǰµÄ״̬¡£Ó¦ÓÿÉÒÔͨ¹ýÖØ·ÅʼþÀ´Öؽ¨ÊµÌåÏÖÔÚµÄ״̬¡£Ö»ÒªÒµÎñʵÌå·¢Éú±ä»¯£¬ÐÂʼþ¾Í»áÌí¼Óµ½Ê¼þ±íÖС£ÒòΪ±£´æÊ¼þÊǵ¥Ò»²Ù×÷£¬Òò´Ë¿Ï¶¨ÊÇÔ×ÓÐԵġ£
ΪÁËÀí½âʼþÔ´¹¤×÷·½Ê½£¬¿¼ÂÇÒÔʼþʵÌå×÷Ϊһ¸öÀý×Ó˵Ã÷¡£´«Í³·½Ê½ÖУ¬Ã¿¸ö¶©µ¥Ó³ÉäΪORDER±íÖÐÒ»ÐС£µ«ÊǶÔÓÚʼþÔ´·½Ê½£¬¶©µ¥·þÎñÒÔʼþ״̬¸Ä±ä·½Ê½´æ´¢Ò»¸ö¶©µ¥£º´´½¨µÄ£¬ÒÑÅú×¼µÄ£¬ÒÑ·¢»õµÄ£¬È¡ÏûµÄ;ÿ¸öʼþ°üÀ¨×ã¹»ÐÅÏ¢À´Öؽ¨¶©µ¥µÄ״̬¡£

ʼþÔ´·½·¨ÓкܶàÓŵ㣺½â¾öÁËʼþÇý¶¯¼Ü¹¹¹Ø¼üÎÊÌ⣬ʹµÃÒµÎñʵÌå¸üкÍʼþ·¢²¼Ô×Ó»¯£¬µ«ÊÇÒ²´æÔÚȱµã£¬ÒòΪÊdz־û¯Ê¼þ¶ø²»ÊǶÔÏ󣬵¼ÖÂÊý¾Ý²éѯʱ£¬±ØÐëʹÓÃ
Command Query Responsibility Segregation (CQRS) À´Íê³É²éѯҵÎñ£¬´Ó¿ª·¢½Ç¶È¿´£¬´æÔÚÒ»¶¨ÌôÕ½¡£
1.2.3.2 ÈçºÎ±ÜÃâʼþÖØ¸´Ïû·Ñ?
Òª±ÜÃâʼþÖØ¸´Ïû·Ñ£¬ÐèÒªÏû·ÑʼþµÄ·þÎñʵÏÖ·þÎñÃݵȣ¬ÒòΪ´æÔÚÖØÊԺʹíÎó²¹³¥»úÖÆ£¬²»¿É±ÜÃâµÄÔÚϵͳÖдæÔÚÖØ¸´ÊÕµ½ÏûÏ¢µÄ³¡¾°£¬·þÎñÃݵÈÄÜÌá¸ßÊý¾ÝµÄÒ»ÖÂÐÔ¡£ÔÚ±à³ÌÖÐ,Ò»¸öÃݵȲÙ×÷µÄÌØµãÊÇÆäÈÎÒâ¶à´ÎÖ´ÐÐËù²úÉúµÄÓ°Ïì¾ùÓëÒ»´ÎÖ´ÐеÄÓ°ÏìÏàͬ£¬Òò´ËÐèÒª¿ª·¢ÈËÔ±ÔÚ¹¦ÄÜÉè¼ÆÊµÏÖʱ£¬ÐèÒªÌØ±ð×¢Òâ·þÎñµÄÃݵÈÐÔ¡£
1.2.4 ʼþÇý¶¯¼Ü¹¹Ö®·Ö²¼Ê½Êý¾Ý²éѯ
΢·þÎñ¼Ü¹¹Ï£¬ÓÉÓÚ·Ö²¼Ê½Êý¾Ý¿âµÄ´æÔÚ£¬µ¼ÖÂÔÚÖ´ÐÐÓû§ÒµÎñÊý¾Ý²éѯʱ£¬Í¨³£ÐèÒª¿ç¶à¸ö΢·þÎñÊý¾Ý¿â½øÐÐÊý¾Ý²éѯ£¬Ò²¾ÍÊÇ·Ö²¼Ê½Êý¾Ý²éѯ¡£ÄÇôÎÊÌâÀ´ÁË£¬ÓÉÓÚÿ¸ö΢·þÎñµÄÊý¾Ý¶¼ÊÇ˽Óл¯µÄ£¬Ö»ÄÜͨ¹ý¸÷×ÔµÄREST½Ó¿Ú»ñÈ¡£¬Èç¹û¸ºÔðÒµÎñ²éѯµÄ¹¦ÄÜÄ£¿é£¬Í¨¹ýµ÷Óø÷¸ö΢·þÎñµÄREST½Ó¿ÚÀ´·Ö±ð»ñÈ¡»ù´¡Êý¾Ý£¬È»ºóÔÚÄÚ´æÖÐÔÙ½øÐÐÒµÎñÊý¾ÝÆ´×°ºó£¬ÔÙ·µ»Ø¸øÓû§¡£¸Ã·½·¨ÎÞÂÛ´Ó³ÌÐòÉè¼Æ»òÊDzéѯÐÔÄܽǶȿ´£¬¶¼²»ÊÇÒ»¸öºÜºÃµÄ·½·¨¡£ÄÇôÈçºÎ½â¾ö΢·þÎñ¼Ü¹¹Ïµķֲ¼Ê½Êý¾Ý²éѯÎÊÌâÄØ?
ÔÚ¸ø³ö½â¾ö·½°¸Ö®Ç°£¬ÐèÒª¶ÁÕßÊ×ÏÈÁ˽âÏÂÎﻯÊÓͼºÍÃüÁî²éѯְÔð·ÖÀëµÈÏà¹Ø¸ÅÄî¡£
1.2.4.1 ʲôÊÇÎﻯÊÓͼ(merialized views)?
ÎﻯÊÓͼÊǰüÀ¨Ò»¸ö²éѯ½á¹ûµÄÊý¾Ý¿â¶ÔÏñ£¬ËüÊÇÔ¶³ÌÊý¾ÝµÄµÄ±¾µØ¸±±¾£¬»òÕßÓÃÀ´Éú³É»ùÓÚÊý¾Ý±íÇóºÍµÄ»ã×Ü±í¡£ÎﻯÊÓͼ´æ´¢»ùÓÚÔ¶³Ì±íµÄÊý¾Ý£¬Ò²¿ÉÒÔ³ÆÎª¿ìÕÕ¡£Õâ¸ö»ù±¾ÉϾÍ˵³öÁËÎﻯÊÓͼµÄ±¾ÖÊ£¬ËüÊÇÒ»×é²éѯµÄ½á¹û£¬ÕâÑùÊÆ±ØÎª½«À´ÔÙ´ÎÐèÒªÕâ×éÊý¾Ýʱ´ó´óÌá¸ß²éѯÐÔÄÜ¡£ÎﻯÊÓͼÓÐÁ½ÖÖË¢ÐÂģʽON
DEMANDºÍON COMMIT£¬Óû§¿É¸ù¾Ýʵ¼ÊÇé¿ö½øÐÐÉèÖá£
ÎﻯÊÓͼ¶ÔÓÚÓ¦ÓòãÊÇ͸Ã÷µÄ£¬²»ÐèÒªÓÐÈκεĸ͝£¬ÖÕ¶ËÓû§ÉõÖÁ¶¼¸Ð¾õ²»µ½µ×²ãÊÇÓõÄÎﻯÊÓͼ¡£×ÜÖ®£¬Ê¹ÓÃÎﻯÊÓͼµÄÄ¿µÄÒ»¸öÊÇÌá¸ß²éѯÐÔÄÜ£¬ÁíÒ»¸öÊÇÓÉÓÚÎﻯÊÓͼ°üº¬µÄÊý¾ÝÊÇÔ¶³ÌÊý¾Ý¿âµÄÊý¾Ý¿ìÕÕ»ò¿½±´£¬Î¢·þÎñ¿Éͨ¹ýÎﻯÊÓͼºÍÃüÁî²éѯְÔð·ÖÀë(CQRS)¼¼Êõ(²Î¼ûÒÔÏÂÕ½Ú)ʵÏÖ·Ö²¼Ê½Êý¾Ý²éѯ¡£
1.2.4.2 ʲôÊÇÃüÁî²éѯְÔð·ÖÀë(CQRS)?
ÔÚ³£Óõĵ¥ÌåÓ¦Óüܹ¹ÖУ¬Í¨³£¶¼ÊÇͨ¹ýÊý¾Ý·ÃÎʲãÀ´Ð޸ĻòÕß²éѯÊý¾Ý£¬Ò»°ãÐ޸ĺͲéѯʹÓõÄÊÇÏàͬµÄʵÌå¡£ÔÚһЩҵÎñÂß¼¼òµ¥µÄϵͳÖпÉÄÜûÓÐʲôÎÊÌ⣬µ«ÊÇËæ×ÅϵͳÂß¼±äµÃ¸´ÔÓ£¬Óû§Ôö¶à£¬ÕâÖÖÉè¼Æ¾Í»á³öÏÖһЩÐÔÄÜÎÊÌâ;ÁíÍâ¸üÖØÒªµÄÊÇ£¬ÔÚ΢·þÎñ¼Ü¹¹Ï£¬Í¨³£ÐèÒª¿ç¶à¸ö΢·þÎñÊý¾Ý¿âÀ´²éѯÊý¾Ý£¬´Ëʱ£¬ÎÒÃǿɽèÖúÃüÁî²éѯְÔð·ÖÀë(CQRS)À´ÓÐЧ½â¾öÕâЩÎÊÌâ¡£
CQRSʹÓ÷ÖÀëµÄ½Ó¿Ú½«Êý¾Ý²éѯ²Ù×÷(Queries)ºÍÊý¾ÝÐ޸IJÙ×÷(Commands)·ÖÀ뿪À´£¬ÕâÒ²Òâζ×ÅÔÚ²éѯºÍ¸üйý³ÌÖÐʹÓõÄÊý¾ÝÄ£ÐÍÒ²ÊDz»Ò»ÑùµÄ¡£ÕâÑù¶ÁºÍдÂß¼¾Í¸ôÀ뿪À´ÁË¡£Ê¹ÓÃCQRS·ÖÀëÁ˶ÁдְÔðÖ®ºó£¬¿ÉÒÔ¶ÔÊý¾Ý½øÐжÁд·ÖÀë²Ù×÷À´¸Ä½øÐÔÄÜ£¬Í¬Ê±Ìá¸ß¿ÉÀ©Õ¹ÐԺͰ²È«¡£ÈçÏÂͼ£º

Ö÷Êý¾Ý¿â´¦ÀíCUD£¬´Ó¿â´¦ÀíR£¬´Ó¿âµÄµÄ½á¹¹¿ÉÒÔºÍÖ÷¿âµÄ½á¹¹ÍêȫһÑù£¬Ò²¿ÉÒÔ²»Ò»Ñù£¬´Ó¿âÖ÷ÒªÓÃÀ´½øÐÐÖ»¶ÁµÄ²éѯ²Ù×÷¡£ÔÚÊýÁ¿ÉÏ´Ó¿âµÄ¸öÊýÒ²¿ÉÒÔ¸ù¾Ý²éѯµÄ¹æÄ£½øÐÐÀ©Õ¹£¬ÔÚÒµÎñÂß¼ÉÏ£¬Ò²¿ÉÒÔ¸ù¾ÝרÌâ´ÓÖ÷¿âÖл®·Ö³ö²»Í¬µÄ´Ó¿â¡£´Ó¿âÒ²¿ÉÒÔʵÏÖ³ÉReportingDatabase£¬¸ù¾Ý²éѯµÄÒµÎñÐèÇ󣬴ÓÖ÷¿âÖгéȡһЩ±ØÒªµÄÊý¾ÝÉú³ÉһϵÁвéѯ±¨±íÀ´´æ´¢¡£

ʹÓÃReportingDatabaseµÄһЩÓŵãͨ³£¿ÉÒÔʹµÃ²éѯ±äµÃ¸ü¼Ó¼òµ¥¸ßЧ£º
¡¤ ReportingDatabaseµÄ½á¹¹ºÍÊý¾Ý±í»áÕë¶Ô³£ÓõIJéѯÇëÇó½øÐÐÉè¼Æ¡£
¡¤ ReportingDatabaseÊý¾Ý¿âͨ³£»áÈ¥Õý¹æ»¯£¬´æ´¢Ò»Ð©ÈßÓà¶ø¼õÉÙ±ØÒªµÄJoinµÈÁªºÏ²éѯ²Ù×÷£¬Ê¹µÃ²éѯ¼ò»¯ºÍ¸ßЧ£¬Ò»Ð©ÔÚÖ÷Êý¾Ý¿âÖÐÓò»µ½µÄÊý¾ÝÐÅÏ¢£¬ÔÚReportingDatabase¿ÉÒÔ²»Óô洢¡£
¡¤ ¿ÉÒÔ¶ÔReportingDatabaseÖØ¹¹ÓÅ»¯£¬¶ø²»ÓÃÈ¥¸Ä±ä²Ù×÷Êý¾Ý¿â¡£
¡¤ ¶ÔReportingDatabaseÊý¾Ý¿âµÄ²éѯ²»»á¸ø²Ù×÷Êý¾Ý¿â´øÀ´ÈκÎѹÁ¦¡£
¡¤ ¿ÉÒÔÕë¶Ô²»Í¬µÄ²éѯÇëÇó½¨Á¢²»Í¬µÄReportingDatabase¿â¡£
1.2.4.3 ÈçºÎʵÏÖʼþÇý¶¯¼Ü¹¹ÏµÄÊý¾Ý²éѯ·þÎñ?
ʼþÇý¶¯²»½ö¿ÉÒÔÓÃÓÚ·Ö²¼Ê½Êý¾ÝÒ»ÖÂÐÔ±£Ö¤£¬»¹¿ÉÒÔ½èÖúÎﻯÊÓͼºÍÃüÁî²éѯְÔð·ÖÀë¼¼Êõ£¬Ê¹ÓÃʼþÀ´Î¬»¤²»Í¬Î¢·þÎñÓµÓÐÊý¾ÝÔ¤Á¬½Ó(pre-join)µÄÎﻯÊÓͼ£¬´Ó¶øÊµÏÖ΢·þÎñ¼Ü¹¹Ïµķֲ¼Ê½Êý¾Ý²éѯ¡£Î¬»¤ÎﻯÊÓͼµÄ·þÎñ¶©ÔÄÁËÏà¹ØÊ¼þ²¢ÔÚʼþ·¢Éúʱ¸üÐÂÎﻯÊÓͼ¡£ÀýÈ磬¿Í»§¶©µ¥ÊÓͼ¸üзþÎñ(ά»¤¿Í»§¶©µ¥ÊÓͼ)»á¶©ÔÄÓɿͻ§·þÎñºÍ¶©µ¥·þÎñ·¢²¼µÄʼþ(Äú»¹¿ÉÒÔʹÓÃʼþÀ´Î¬»¤Óɶà¸ö΢·þÎñÓµÓеÄÊý¾Ý×é³ÉµÄÎﻯÊÓͼ¡£

ÀýÈçÉÏͼÖмäµÄ ¡°¿Í»§¶©µ¥ÊÓͼ¸üС±·þÎñ£¬Ö÷Òª¸ºÔð¿Í»§¶©µ¥ÊÓͼµÄ¸üС£¸Ã·þÎñ¶©ÔÄÁ˿ͻ§·þÎñºÍ¶©µ¥·þÎñ·¢²¼µÄʼþ¡£µ±¡°¿Í»§¶©µ¥ÊÓͼ¸üС±·þÎñÊÕµ½ÁËÉÏͼ×ó²àµÄ¿Í»§»òÕß¶©µ¥¸üÐÂʼþ£¬Ôò»á´¥·¢¸üпͻ§¶©µ¥ÎﻯÊÓͼÊý¾Ý¼¯¡£ÕâÀï¿ÉÒÔʹÓÃÎĵµÊý¾Ý¿â(ÀýÈçMongoDB)À´ÊµÏÖ¿Í»§¶©µ¥ÊÓͼ£¬ÎªÃ¿¸öÓû§´æ´¢Ò»¸öÎĵµ¡£¶øÉÏͼÓÒ²àµÄ¿Í»§¶©µ¥ÊÓͼ²éѯ·þÎñ¸ºÔðÏìÓ¦¶Ô¿Í»§ÒÔ¼°×î½ü¶©µ¥(ͨ¹ý²éѯ¿Í»§¶©µ¥ÊÓͼÊý¾Ý¼¯)µÄ²éѯ¡£
×ÜÖ®£¬ÉÏͼËùʾҵÎñÂß¼£¬Óõ½ÁËʼþÇý¶¯¡¢ÎﻯÊÓͼºÍÃüÁî²éѯְÔð·ÖÀëµÈ¼¼Êõ£¬ÓÐЧ½â¾öÁË΢·þÎñ¼Ü¹¹Ï·ֲ¼Ê½Êý¾Ý²éѯµÄÎÊÌâ¡£
1.2.5 ʼþÇý¶¯¼Ü¹¹ÓÅȱµã
ʼþÇý¶¯¼Ü¹¹¼ÈÓÐÓŵãÒ²ÓÐȱµã£¬´Ë¼Ü¹¹¿ÉÒÔʵÏÖ¿ç¶à¸ö·þÎñµÄÊÂÎñʵÏÖ£¬ÇÒÌṩ×îÖÕÊý¾ÝÒ»ÖÂÐÔ£¬²¢ÇÒʹµÃ·þÎñÄܹ»×Ô¶¯Î¬»¤²éѯÊÓͼ;¶øÈ±µãÔÚÓÚ±à³Ìģʽ±È´«Í³»ùÓÚÊÂÎñµÄ½»Ò×ģʽ¸ü¼Ó¸´ÔÓ£¬±ØÐëʵÏÖ²¹³¥ÊÂÎñÒÔ±ã´ÓÓ¦ÓóÌÐò¼¶¹ÊÕÏÖлָ´£¬ÀýÈ磬Èç¹ûÐÅÓüì²é²»³É¹¦Ôò±ØÐëÈ¡Ïû¶©µ¥;ÁíÍ⣬ӦÓñØÐëÓ¦¶Ô²»Ò»ÖµÄÊý¾Ý£¬±ÈÈçµ±Ó¦ÓöÁȡδ¸üеÄ×îÖÕÊÓͼʱҲ»áÓö¼ûÊý¾Ý²»Ò»ÖÂÎÊÌâ¡£ÁíÍâÒ»¸öȱµãÔÚÓÚ¶©ÔÄÕß±ØÐë¼ì²âºÍºöÂÔÈßÓàʼþ£¬±ÜÃâʼþÖØ¸´Ïû·Ñ¡£
1.3 ×ܽá
ÔÚ΢·þÎñ¼Ü¹¹ÖУ¬Ã¿¸ö΢·þÎñ¶¼ÓÐ×Ô¼ºË½ÓеÄÊý¾Ý¼¯¡£²»Í¬Î¢·þÎñ¿ÉÄÜʹÓò»Í¬µÄSQL»òÕßNoSQLÊý¾Ý¿â¡£¾¡¹ÜÊý¾Ý¿â¼Ü¹¹ÓкÜÇ¿µÄÓÅÊÆ£¬µ«ÊÇÒ²Ãæ¶ÔÊý¾Ý·Ö²¼Ê½¹ÜÀíµÄÌôÕ½¡£µÚÒ»¸öÌôÕ½¾ÍÊÇÈçºÎÔÚ¶à·þÎñÖ®¼äά»¤ÒµÎñÊý¾ÝÒ»ÖÂÐÔ;µÚ¶þ¸öÌôÕ½ÊÇÈçºÎ´Ó¶à·þÎñ»·¾³ÖлñȡһÖÂÐÔÊý¾Ý¡£
×î¼Ñ½â¾ö°ì·¨ÊDzÉÓÃʼþÇý¶¯¼Ü¹¹¡£ÆäÖÐÅöµ½µÄÒ»¸öÌôÕ½ÊÇÈçºÎÔ×ÓÐԵĸüÐÂ״̬ºÍ·¢²¼Ê¼þ¡£Óм¸ÖÖ·½·¨¿ÉÒÔ½â¾ö´ËÎÊÌ⣬°üÀ¨½«Êý¾Ý¿âÊÓΪÏûÏ¢¶ÓÁкÍʼþÔ´µÈ¡£
´ÓĿǰ¼¼ÊõÓ¦Ó÷¶Î§ºÍ³ÉÊì¶È¿´£¬ÍƼöʹÓõÚÒ»ÖÖ·½Ê½(±¾µØÊÂÎñ·¢²¼Ê¼þ)£¬À´ÊµÏÖʼþͶµÝÔ×Ó»¯£¬¼´¿É¿¿Ê¼þͶµÝ¡£
ÐèÒªÌáÐÑ£º!!!Êý¾ÝÒ»ÖÂÐÔÊÇ΢·þÎñ¼Ü¹¹Éè¼ÆÖÐΨ¿Ö±ÜÖ®²»¼°È´ÓÖ²»µÃ²»¿¼ÂǵϰÌ⡣ͨ¹ý±£Ö¤Ê¼þÇý¶¯ÊµÏÖ×îÖÕÊý¾ÝµÄÒ»ÖÂÐÔ£¬´Ë·½°¸µÄÓÅÁÓ£¬Ò²²»Äܼòµ¥µÄÒ»ÑÔ¶ø¸ÅÖ®£¬¶øÊÇÓ¦¸Ã¸ù¾Ý³¡¾°¶¨¶á£¬ÊʺϵIJÅÊÇ×îºÃµÄ¡£ÁíÍ⣬ÎÒÃÇÔÚ¶Ô΢·þÎñ½øÐÐÒµÎñ»®·ÖµÄʱºò¾Í¾¡¿ÉÄܵıÜÃâ¡°¿ÉÄÜ»á²úÉúÒ»ÖÂÐÔÎÊÌ⡱µÄÉè¼Æ¡£Èç¹ûÕâÖÖÉè¼Æ¹ý¶à£¬Ò²ÐíÊÇʱºò¿¼ÂǸĸÄÉè¼ÆÁË¡£ |