±à¼ÍƼö: |
±¾ÎĽ«Ïò´ó¼Ò½éÉÜʲôÊÇ·´Ó¦Ê½£¬ÒÔ¼°ÎªÊ²Ã´Òª²ÉÓ÷´Ó¦Ê½¼Ü¹¹£¬²¢ÇÒͨ¹ýÒ»¸ö±à³ÌʾÀý£¬ÉîÈë·ÖÎö´«Í³µÄ±à³Ì·½Ê½»á´øÀ´ÄÄЩÎÊÌâºÍÌôÕ½£¬ÒÔ¼°ÈçºÎ×öÒì²½»¯¸ÄÔ죬˳ÀûÂõ³ö·´Ó¦Ê½¼Ü¹¹ÑݽøµÄµÚÒ»²½¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°£¬ÓÉ»ðÁú¹ûÈí¼þDelores±à¼¡¢ÍƼö¡£ |
|
ÌÔ±¦´Ó2018Ä꿪ʼ¶ÔÕûÌå¼Ü¹¹½øÐз´Ó¦Ê½Éý¼¶£¬ È¡µÃÁ˷dz£ºÃµÄ³É¼¨¡£ÆäÖСº²ÂÄãϲ»¶¡»Ó¦ÓÃÉÏÏÞ QPS ÌáÉýÁË 96%£¬Í¬Ê±»úÆ÷ÊýÁ¿Ëõ¼õÁËÒ»°ë£»ÁíÒ»ºËÐÄÓ¦ÓáºÎÒµÄÌÔ±¦¡»Êµ¼ÊÏßÉÏÏìӦʱ¼äϽµÁË 40% ÒÔÉÏ¡£PayPalƾ½èÆä»ùÓÚAkka¹¹½¨µÄ·´Ó¦Ê½Æ½Ì¨squbs£¬½öʹÓÃ8̨2vCPUÐéÄâ»ú£¬Ã¿Ìì¿ÉÒÔ´¦Àí³¬¹ý10Òڱʽ»Ò×£¬Óë»ùÓÚSpringʵÏÖµÄÀÏϵͳÏà±È£¬´úÂëÁ¿½µµÍÁË80%£¬¶øÐÔÄÜÈ´ÌáÉýÁË10±¶¡£Äܹ»È¡µÃÈç´ËºÃµÄ³É¼¨£¬ÈËÃDz»½ûÒªÎÊ·´Ó¦Ê½µ½µ×ÊÇʲô£¿ Æäʵ·´Ó¦Ê½²¢²»ÊÇÒ»¸öÐÂÏʵĸÅÄËüµÄÁé¸ÐÀ´Ô´×îÔç¿ÉÒÔ×·Ëݵ½90Äê´ú£¬µ«ÊÇÖ±µ½2013Ä꣬Roland KuhnµÈÈË·¢²¼ÁË¡¶·´Ó¦Ê½ÐûÑÔ¡·ºó²ÅÂýÂý±»ÈËÊìÖª£¬¼Ì¶øÔÚ2014ÄêÓÀ´±¬·¢Ê½Ôö³¤£¬±È½ÏÓÐÒâ˼µÄÊÇ£¬Í¬Ê±ÓÀ´±¬·¢Ê½Ôö³¤µÄ»¹ÓÐÁìÓòÇý¶¯Éè¼Æ(DDD)£¬ÔÒòÊÇ2014Äê3ÔÂ25ÈÕ£¬Martin FowlerºÍJames LewisÏò´óÖÚ½éÉÜÁË΢·þÎñ¼Ü¹¹£¬¶ø·´Ó¦Ê½ºÍÁìÓòÇý¶¯ÊÇ΢·þÎñ¼Ü¹¹µÃÒÔÂ䵨µÄÓÐÁ¦±£ÕÏ¡£½ô½Óן÷ÖÖ·´Ó¦Ê½±à³Ì¿ò¼ÜÏà¼Ì½øÈë´ó¼ÒÊÓÒ°£¬ÈçRxJava¡¢Akka¡¢Spring Reactor/WebFlux¡¢Play FrameworkºÍδÀ´µÄDubbo3µÈ£¬°¢ÀïÄÚ²¿ÔÚ×ö·´Ó¦Ê½¸ÄÔìʱҲ·õ»¯ÁËһЩ·´Ó¦Ê½ÏîÄ¿£¬°üÀ¨AliRxObjC¡¢RxAOPºÍAliRxUtilµÈ¡£ ´ÓĿǰµÄÇ÷ÊÆ¿´À´£¬·´Ó¦Ê½¸ÅÄ»áÖð½¥ÉîÈëÈËÐÄ£¬ ²¢ÇÒ½«ÒýÁìÏÂÒ»´ú¼¼Êõ±ä¸ï¡£
1 ʲôÊÇ·´Ó¦Ê½£¿
1.1 ·´Ó¦Ê½½éÉÜ
ΪÁËÖ±¹ÛµØÁ˽âʲôÊÇ·´Ó¦Ê½£¬ÎÒÃÇÏÈ´ÓÒ»¸ö´ó¼Ò¶¼±È½ÏÊìϤµÄÀà±È¿ªÊ¼¡£Ê×ÏÈ´ò¿ªExcel£¬ÔÚB¡¢C¡¢DÈýÁÐÊäÈëÈçϹ«Ê½£º

B¡¢CºÍDÈýÁÐÿ¸öµ¥Ôª¸ñµÄÖµ¾ùÒÀÀµÆä×ó²àµÄµ¥Ôª¸ñ£¬µ±ÎÒÃÇÔÚAÁÐÒÀ´ÎÊäÈë1¡¢2ºÍ3ʱ£¬±ä»¯»á×Ô¶¯´«µÝµ½ÁËB¡¢CºÍDÈýÁУ¬²¢´¥·¢ÏàӦ״̬±ä¸ü£¬ÈçÏÂͼ£º

ÎÒÃÇ¿ÉÒÔ°ÑAÁдÓÉϵ½ÏÂÏëÏó³ÉÒ»¸öÊý¾ÝÁ÷£¬Ã¿Ò»¸öÊý¾Ýµ½´ïʱ¶¼»á´¥·¢Ò»¸öʼþ£¬¸Ãʼþ»á±»´«²¥µ½ÓҲ൥Ԫ¸ñ£¬ºóÕßÔò»á´¦Àíʼþ²¢¸Ä±ä×ÔÉíµÄ״̬¡£ÕâһϵÁÐÁ÷³ÌÆäʵ¾ÍÊÇ·´Ó¦Ê½µÄºËÐÄ˼Ïë¡£
ͨ¹ýÕâ¸öÀý×Ó£¬ÄãÓ¦¸ÃÄܸÐÊܵ½·´Ó¦Ê½µÄºËÐÄÊÇÊý¾ÝÁ÷(data stream)£¬ ÏÂÃæÎÒÃÇÔÙÀ´¿´Ò»¸öÀý×Ó¡£ÎÒÃǺܶàÈËÿÌì¶¼»á×øµØÌúÉÏϰ࣬µØÌúÿÁ½·ÖÖÓÒ»°à£¬²¢ÇÒͬһÌõ¹ìµÀ»á±»ºÜ¶àµØÌú¹²Ïí£¬Äã»á²»»áÒòΪµ£ÐÄ׷⣬¶ø²»¸Ò×øÊ×βÁ½½Ú³µÏáÄØ£¿ ÆäʵÈç¹û²ÉÓ÷´Ó¦Ê½¼Ü¹¹¹¹½¨µØÌúϵͳ£¬¾ÍÎÞÐèµ£ÐÄ׷βÎÊÌâ¡£ÔÚ·´Ó¦Ê½ÏµÍ³ÖУ¬Ã¿Á¾µØÌú¶¼»áʵʱ½«×Ô¼ºµÄËٶȺÍλÖõÈ״̬ÐÅϢ֪ͨ¸øÉÏÏÂÓÎµÄÆäËûµØÌú£¬Í¬Ê±Ò²»áʵʱµÄ½ÓÊÕÆäËûµØÌúµÄ״̬ÐÅÏ¢£¬²¢ÊµÊ±×ö³ö·´À¡¡£ÀýÈçµ±·¢ÏÖÏÂÓεØÌúͻȻÒâÍâ¼õËÙ£¬ÔòÁ¢¼´µ÷Õû×ÔÉíËÙ¶È£¬²¢½«¼õËÙʼþ֪ͨµ½ÉÏÓεØÌú£¬Èç´Ë£¬ÕûÌõ¹ìµÀÉϵÄËùÓеØÌúÐγÉÒ»ÖÖ»ØÑ¹»úÖÆ(back pressure)£¬¸ù¾ÝÉÏÏÂÓÎ״̬×Ô¶¯µ÷Õû×ÔÉíËÙ¶È¡£ ÏÂÃæÎÒÃÇÀ´¿´ÏÂά»ù°Ù¿Æ¹ØÓÚ·´Ó¦Ê½±à³ÌµÄ¶¨Ò壺
·´Ó¦Ê½±à³Ì (reactive programming) ÊÇÒ»ÖÖ»ùÓÚÊý¾ÝÁ÷ (data stream) ºÍ ±ä»¯´«µÝ (propagation of change) µÄÉùÃ÷ʽ (declarative) µÄ±à³Ì·¶Ê½¡£
´ÓÉÏÃæµÄ¶¨ÒåÖУ¬ÎÒÃÇ¿ÉÒÔ¿´³ö·´Ó¦Ê½±à³ÌµÄºËÐÄÊÇÊý¾ÝÁ÷ÒÔ¼°±ä»¯´«µÝ¡£Î¬»ù°Ù¿Æ¸ø³öµÄ¶¨Òå±È½ÏͨÓ㬾ßÓÐÆÕÊÊÐÔ£¬Ã»ÓÐÇø·ÖÊý¾ÝÁ÷µÄͬ²½ºÍÒ첽ģʽ£¬ ¸ü׼ȷµØËµ£¬Òì²½Êý¾ÝÁ÷(asynchronous data stream)»òÕß˵·´Ó¦Ê½Á÷(reactive stream)²ÅÊÇ·´Ó¦Ê½±à³ÌµÄ×î¼Ñʵ¼ù¡£Ï¸ÐĵĶÁÕ߻ᷢÏÖ£¬½²ÁËÕâô¶à£¬Õâ²»¾ÍÊǹ۲ìÕßģʽ(Observer Pattern)Â ÆäʵÕâ¸ö˵·¨²¢²»×¼È·£¬Æäʵ·´Ó¦Ê½²¢²»ÊÇÖ¸¾ßÌåµÄ¼¼Êõ£¬¶øÊÇָһЩ¼Ü¹¹Éè¼ÆÔÔò£¬ ¹Û²ìÕßģʽÊÇʵÏÖ·´Ó¦Ê½µÄÒ»ÖÖÊֶΣ¬ÔÚ½ÓÏÂÀ´µÄ·´Ó¦Ê½Á÷(Reactive Stream)Ò»½Ú£¬ÎÒÃǻᷢÏÖ·´Ó¦Ê½Á÷»ùÓÚ¹Û²ìÕßģʽÀ©Õ¹Á˸ü¶àµÄ¹¦ÄÜ£¬¸üÇ¿´óÒ²¸üÒ×Óá£
1.2 ·´Ó¦Ê½ÀúÊ·
ÔçÔÚ1985Ä꣬David Harel ºÍ Amir Pnueli ¾Í·¢±íÁË¡¶·´Ó¦Ê½ÏµÍ³µÄ¿ª·¢¡·ÂÛÎÄ£¬ÔÚÂÛÎÄÖУ¬ËûÃDzÉÓöþ·Ö·¨¶Ô¸´ÔӵļÆËã¹ý³Ì½øÐйéÄÉ£¬Ìá³öÁËת»»Ê½(transformative)Ó뷴Ӧʽ(reactive)ϵͳ¡£ÆäÖз´Ó¦Ê½ÏµÍ³¾ÍÊÇÖ¸Äܹ»³ÖÐøµØÓë»·¾³½øÐн»»¥£¬²¢ÇÒ¼°Ê±µØ½øÐÐÏìÓ¦¡£ÀýÈçÊÓÆµ¼à¿ØÏµÍ³»á³ÖÐø¼à²â£¬ ²¢µ±ÓÐİÉúÈË´³ÈëʱÁ¢¿Ì´¥·¢¾¯±¨¡£
±í1 ·´Ó¦Ê½ÀúÊ·

ͼ1 ¹È¸èËÑË÷Ç÷ÊÆ

´ÓGoogleËÑË÷Ç÷ÊÆÉÏ¿ÉÒÔ¿´³ö£¬´Ó2013Äê6Ô·ݿªÊ¼£¬·´Ó¦Ê½±à³ÌµÄËÑËØÇ÷ÊÆ³öÏÖÁ˱¬·¢Ê½Ôö³¤£¬ÔÒòÊÇ2013Äê6Ô·´Ó¦Ê½ÐûÑÔ·¢²¼Á˵ÚÒ»¸ö°æ±¾¡£
1.3 ReactiveX ½éÉÜ
ReactiveXÊÇReactive ExtensionsµÄËõд£¬Ò»°ã¼òдΪRx£¬×î³õÊÇLINQµÄÒ»¸öÀ©Õ¹£¬ÓÉ΢ÈíµÄ¼Ü¹¹Ê¦Erik MeijerÁìµ¼µÄÍŶӿª·¢£¬ÔÚ2012Äê11Ô¿ªÔ´¡£RxÊÇÒ»¸ö±à³ÌÄ£ÐÍ£¬Ä¿±êÊÇÌṩһÖµıà³Ì½Ó¿Ú£¬°ïÖú¿ª·¢Õ߸ü·½±ãµÄ´¦ÀíÒì²½Êý¾ÝÁ÷¡£RxÖ§³Ö¼¸ºõÈ«²¿µÄÁ÷Ðбà³ÌÓïÑÔ£¬´ó²¿·ÖÓïÑÔ¿âÓÉReactiveXÕâ¸ö×éÖ¯¸ºÔðά»¤£¬±È½ÏÁ÷ÐеÄÓÐRxJava/RxJS/Rx.NET/Rx.Scala/ Rx.Swift£¬ÉçÇøÍøÕ¾ÊÇhttp://reactivex.io/¡£
1.4 ·´Ó¦Ê½ÐûÑÔ
2013Äê6Ô£¬Roland KuhnµÈÈË·¢²¼ÁË¡¶·´Ó¦Ê½ÐûÑÔ¡·£¬ ¸ÃÐûÑÔ¶¨ÒåÁË·´Ó¦Ê½ÏµÍ³Ó¦¸Ã¾ß±¸µÄһЩ¼Ü¹¹Éè¼ÆÔÔò¡£·ûºÏ·´Ó¦Ê½Éè¼ÆÔÔòµÄϵͳ³ÆÎª·´Ó¦Ê½ÏµÍ³¡£¸ù¾Ý·´Ó¦Ê½ÐûÑÔ£¬ ·´Ó¦Ê½ÏµÍ³ÐèÒª¾ß±¸¼´Ê±ÏìÓ¦ÐÔ(Responsive)¡¢»Øµ¯ÐÔ(Resilient)¡¢µ¯ÐÔ(Elastic)ºÍÏûÏ¢Çý¶¯(Message Driven)ËĸöÌØÖÊ£¬ÒÔÏÂÄÚÈÝÕª×Ô·´Ó¦Ê½ÐûÑÔ¹ÙÍø£¬ ÃèÊö±È½Ï³éÏ󣬴ó¼Ò²»±Ø¾À½áϸ½Ú£¬Á˽⼴¿É¡£
¼´Ê±ÏìÓ¦ÐÔ(Responsive)¡£ÏµÍ³Ó¦¸Ã¶ÔÓû§µÄÇëÇó¼´Ê±×ö³öÏìÓ¦¡£¼´Ê±ÏìÓ¦ÊÇ¿ÉÓÃÐÔºÍʵÓÃÐԵĻùʯ£¬ ¶ø¸ü¼ÓÖØÒªµÄÊÇ£¬¼´Ê±ÏìÓ¦Òâζ×Å¿ÉÒÔ¿ìËٵؼì²âµ½ÎÊÌâ²¢ÇÒÓÐЧµØ¶ÔÆä½øÐд¦Àí¡£
»Øµ¯ÐÔ(Resilient)¡£ ϵͳÔÚ³öÏÖʧ°ÜʱÒÀÈ»Äܱ£³Ö¼´Ê±ÏìÓ¦ÐÔ£¬ ÿ¸ö×é¼þµÄ»Ö¸´¶¼±»Î¯ÍиøÁËÁíÒ»¸öÍⲿµÄ×é¼þ£¬ ´ËÍ⣬ÔÚ±ØÒªÊ±¿ÉÒÔͨ¹ý¸´ÖÆÀ´±£Ö¤¸ß¿ÉÓÃÐÔ¡£ Òò´Ë×é¼þµÄ¿Í»§¶Ë²»Ôٳе£×é¼þʧ°ÜµÄ´¦Àí¡£
µ¯ÐÔ(Elastic)¡£ ϵͳÔÚ²»¶Ï±ä»¯µÄ¹¤×÷¸ºÔØÖ®ÏÂÒÀÈ»±£³Ö¼´Ê±ÏìÓ¦ÐÔ¡£ ·´Ó¦Ê½ÏµÍ³¿ÉÒÔ¶ÔÊäÈë¸ºÔØµÄËÙÂʱ仯×ö³ö·´Ó¦£¬±ÈÈçͨ¹ýºáÏòµØÉìËõµ×²ã¼ÆËã×ÊÔ´¡£ ÕâÒâζ×ÅÉè¼ÆÉϲ»ÄÜÓÐÖÐÑëÆ¿¾±£¬ ʹµÃ¸÷¸ö×é¼þ¿ÉÒÔ½øÐÐ·ÖÆ¬»òÕ߸´ÖÆ£¬ ²¢ÔÚËüÃÇÖ®¼ä½øÐиºÔؾùºâ¡£
ÏûÏ¢Çý¶¯(Message Driven)¡£·´Ó¦Ê½ÏµÍ³ÒÀÀµÒì²½µÄÏûÏ¢´«µÝ£¬´Ó¶øÈ·±£ÁËËÉñîºÏ¡¢¸ôÀ롢λÖÃ͸Ã÷µÄ×é¼þÖ®¼äÓÐ×ÅÃ÷È·±ß½ç¡£ ÕâÒ»±ß½ç»¹ÌṩÁ˽«Ê§°Ü×÷ΪÏûϢίÍгöÈ¥µÄÊֶΡ£ ʹÓÃÏÔʽµÄÏûÏ¢´«µÝ£¬¿ÉÒÔͨ¹ýÔÚϵͳÖÐËÜÔì²¢¼àÊÓÏûÏ¢Á÷¶ÓÁУ¬ ²¢ÔÚ±ØÒªÊ±Ó¦ÓûØÑ¹£¬ ´Ó¶øÊµÏÖ¸ºÔعÜÀí¡¢ µ¯ÐÔÒÔ¼°Á÷Á¿¿ØÖÆ¡£ ʹÓÃλÖÃ͸Ã÷µÄÏûÏ¢´«µÝ×÷ΪͨÐŵÄÊֶΣ¬ ʹµÃ¿ç¼¯Èº»òÕßÔÚµ¥¸öÖ÷»úÖÐʹÓÃÏàͬµÄ½á¹¹³É·ÖºÍÓïÒåÀ´¹ÜÀíʧ°Ü³ÉΪÁË¿ÉÄÜ¡£ ·Ç×èÈûµÄͨÐÅʹµÃ½ÓÊÕÕß¿ÉÒÔÖ»Ôڻʱ²ÅÏûºÄ×ÊÔ´£¬ ´Ó¶ø¼õÉÙϵͳ¿ªÏú¡£

1.5 Reactive Streams
·´Ó¦Ê½ÐûÑÔ½ö²ûÊöÁËÉè¼ÆÔÔò£¬²¢Ã»Óиø³ö¾ßÌåµÄʵÏֹ淶£¬µ¼ÖÂÿ¸ö·´Ó¦Ê½¿ò¼Ü¶¼¸÷×ÔʵÏÖÁËÒ»Ì××Ô¼ºµÄAPI¹æ·¶£¬ÇÒÏ໥֮¼äÎÞ·¨»¥Í¨¡£ÎªÁ˽â¾öÕâ¸öÎÊÌ⣬Reactive Streams¹æ·¶Ó¦Ô˶øÉú¡£
Reactive StreamsµÄÄ¿±êÊǶ¨ÒåÒ»×é×îС»¯µÄÒì²½Á÷´¦Àí½Ó¿Ú£¬Ê¹µÃÔÚ²»Í¬¿ò¼ÜÖ®¼ä£¬ÉõÖÁ²»Í¬ÓïÑÔÖ®¼äʵÏÖ½»»¥ÐÔ¡£Reactive Streams¹æ·¶°üº¬ÁË4¸ö½Ó¿Ú£¬7¸ö·½·¨£¬43Ìõ¹æÔòÒÔ¼°Ò»Ì×ÓÃÓÚ¼æÈÝÐÔ²âÊԵıê×¼Ì×¼þTCK(The Technology Compatibility Kit)¡£¸Ã¹æ·¶ÒѾ³ÉΪÁËÒµ½ç±ê×¼£¬ ²¢ÇÒÔÚJava 9ÖÐÒѾʵÏÖ£¬¶ÔÓ¦µÄʵÏÖ½Ó¿ÚΪjava.util.concurrent.Flow¡£ ÓÐÒ»µãÐèÒªÌáÐѵÄÊÇ£¬ËäÈ»Java 9ÒѾʵÏÖÁËReactive Streams£¬µ«Õâ²¢²»Òâζ×ÅÏñRxJava¡¢Reactor¡¢Akka StreamsÕâЩÁ÷´¦Àí¿ò¼Ü¾ÍûÓÐÒâÒåÁË£¬ÊÂʵÉÏǡǡÏà·´¡£Reactive StreamsµÄÄ¿µÄÔÚÓÚÔöÇ¿²»Í¬¿ò¼ÜÖ®¼äµÄ½»»¥ÐÔ£¬ÌṩµÄÊÇÒ»×é×îС¹¦Äܼ¯ºÏ£¬ÎÞ·¨Âú×ãÎÒÃÇÈÕ³£µÄÁ÷´¦ÀíÐèÇó£¬ÀýÈç×éºÏ¡¢¹ýÂË¡¢»º´æ¡¢ÏÞÁ÷µÈ¹¦Äܶ¼ÐèÒª¶îÍâʵÏÖ¡£Á÷´¦Àí¿ò¼ÜµÄÄ¿µÄ¾ÍÔÚÓÚÌṩÕâЩ¶îÍâµÄ¹¦ÄÜʵÏÖ£¬²¢Í¨¹ýReactive Streams¹æ·¶ÊµÏÖ¿ç¿ò¼ÜµÄ½»»¥ÐÔ¡£
¾Ù¸öÀý×ÓÀ´Ëµ£¬MongoDBµÄJavaÇý¶¯ÊµÏÖÁËReactive Streams¹æ·¶£¬ ¿ª·¢ÕßʹÓÃÈκÎÒ»¸öÁ÷´¦Àí¿ò¼Ü£¬½öÐèÒª¼¸ÐдúÂë¼´¿Éʵʱ¼àÌýÊý¾Ý¿âµÄ±ä»¯¡£ÀýÈçÏÂÃæÊÇ»ùÓÚAkka StreamµÄʵÏÖ´úÂ룺
mongo
.collection("users")
.watch()
.toSource
.groupedWithin(10, 1.second)
.throttle(1, 1.second)
.runForeach { docs =>
// ´¦ÀíÔöÁ¿Êý¾Ý
} |
ÉÏÃæµÄ¼¸ÐдúÂëʵÏÖÁËÈçϹ¦ÄÜ£º
½«½ÓÊÕµ½µÄÁ÷Êý¾Ý½øÐлº³åÒÔ·½±ãÅú´¦Àí£¬Âú×ãÒÔÏÂÈÎÒ»Ìõ¼þ±ã½áÊø»º³å²¢Ïòºó´«µÝ
»º³åÂú10¸öÔªËØ
»º³åʱ¼ä³¬¹ýÁË1000ºÁÃë
¶Ô»º³åºóµÄÔªËØ½øÐÐÁ÷¿Ø£¬Ã¿ÃëÖ»ÔÊÐíͨ¹ý1¸öÔªËØ
1.6 С½á
±¾ÕÂÊ×ÏÈͨ¹ýÐÎÏóµÄÀý×ÓÈôó¼Ò¶Ô·´Ó¦Ê½ÏµÍ³ÓÐÒ»¸öÖ±¹ÛµÄÈÏÖª£¬È»ºó´øÁì´ó¼ÒÒ»Æð»Ø¹ËÁË·´Ó¦Ê½µÄ·¢Õ¹ÀúÊ·£¬×îºóÏò´ó¼Ò½éÉÜÁËÈý¸ö·´Ó¦Ê½ÏîÄ¿£¬°üÀ¨ReactiveX¡¢·´Ó¦Ê½ÐûÑÔºÍReactive Streams¡£ ReactiveXÊÇ·´Ó¦Ê½À©Õ¹£¬Ö¼ÔÚΪ¸÷¸ö±à³ÌÓïÑÔÌṩ·´Ó¦Ê½±à³Ì¹¤¾ß¡£·´Ó¦Ê½ÐûÑÔÕ¾ÔÚÒ»¸ö¸ü¸ßµÄ½Ç¶È£¬Ê¹ÓóéÏóÓïÑÔÏò´ó¼ÒÃèÊöʲôÊÇ·´Ó¦Ê½ÏµÍ³£¬ÒÔ¼°ÊµÏÖ·´Ó¦Ê½ÏµÍ³Ó¦¸Ã×ñѵÄһЩÉè¼ÆÔÔò¡£Reactive Streams¹æ·¶µÄÄ¿µÄÔÚÓÚÌá¸ß¸÷¸ö·´Ó¦Ê½¿ò¼ÜÖ®¼äµÄ½»»¥ÐÔ£¬±¾Éí²¢²»ÊʺÏ×÷Ϊ¿ª·¢¿ò¼ÜÖ±½ÓʹÓ㬿ª·¢ÕßÓ¦¸ÃÑ¡ÔñÒ»¸ö³ÉÊìµÄ·´Ó¦Ê½¿ò¼Ü£¬²¢Í¨¹ýReactive Streams¹æ·¶ÓëÆäËü¿ò¼ÜʵÏÖ½»»¥¡£
2 ΪʲôÐèÒª·´Ó¦Ê½£¿
2.1 ÃüÁîʽ±à³Ì VS ÉùÃ÷ʽ±à³Ì
ʵ¼ÊÉÏÎÒÃǾø´ó¶àÊý³ÌÐòÔ±¶¼ÔÚʹÓô«Í³µÄÃüÁîʽ±à³Ì£¬ÕâÒ²ÊǼÆËã»úµÄ¹¤×÷·½Ê½¡£ÃüÁîʽ±à³Ì¾ÍÊǶÔÓ²¼þ²Ù×÷µÄ³éÏó£¬ ³ÌÐòÔ±ÐèҪͨ¹ýÖ¸Á¾«È·µÄ¸æËß¼ÆËã»ú¸ÉʲôÊÂÇé¡£ÕâÒ²ÊDZà³Ì¹¤×÷ÖÐ×î¿ÝÔïµÄµØ·½£¬³ÌÐòÔ±ÐèÒªºÄ¾¡ÄÔÖ£¬½«¸´ÔÓ¡¢Ò×±äµÄÒµÎñÐèÇó·Òë³É¾«È·µÄ¼ÆËã»úÖ¸Áî¡£

ÉùÃ÷ʽ±à³ÌÊǽâ¾ö³ÌÐòÔ±µÄÀûÆ÷£¬ÉùÃ÷ʽ±à³Ì¸ü¹Ø×¢ÎÒÏëҪʲô(What)¶ø²»ÊÇÔõôȥ×ö(How)¡£SQLÊÇ×îµäÐ͵ÄÉùÃ÷ʽÓïÑÔ£¬ÎÒÃÇͨ¹ýSQLÃèÊöÏëҪʲô£¬×îÖÕÓÉÊý¾Ý¿âÒýÇæÖ´ÐÐSQLÓï¾ä²¢½«½á¹û·µ»Ø¸øÎÒÃÇ¡£
SELECT COUNT(*)
FROM USER u WHERE u.age > 30 |
1.5½ÚʹÓÃAkka StreamʵÏÖ¼àÌýMongoDBµÄ´úÂëÒ²ÊǵäÐ͵ÄÉùÃ÷ʽ±à³Ì£¬Èç¹û²ÉÓÃÃüÁîʽ·½Ê½ÖØÐ´£¬ ²»½ö·Ñʱ·ÑÁ¦£¬¶øÇÒ»¹»áµ¼Ö´úÂëÁ¿±©Ôö£¬×îÖØÒªµÄÊÇҪͨ¹ý¸ü¶àµÄµ¥Ôª²âÊÔ±£Ö¤ÊµÏÖµÄÕýÈ·ÐÔ¡£
·´Ó¦Ê½¼Ü¹¹ÍƼöʹÓÃÉùÃ÷ʽ±à³Ì£¬ ʹÓøü½Ó½ü×ÔÈ»ÓïÑԵķ½Ê½ÃèÊöÒµÎñÂß¼£¬ ´úÂëÇåÎúÒ×¶®²¢ÇÒ¸»Óбí´ïÁ¦£¬ ×îÖØÒªµÄÊÇ´ó´ó½µµÍÁ˺óÆÚά»¤³É±¾¡£
2.2 ͬ²½±à³Ì VS Òì²½±à³Ì
µ±Ì¸µ½Í¬²½ÓëÒ첽ʱ£¬¾Í²»µÃ²»ÌáÒ»ÏÂ×èÈûÓë·Ç×èÈûµÄ¸ÅÄÒòΪÕâÁ½×é¸ÅÄîºÜÈÝÒ×»ìÏý¡£µ¼Ö»ìÏýµÄÔÒòÊÇËüÃÇÔÚÃèÊöͬһ¸ö¶«Î÷£¬µ«ÊǹØ×¢µã²»Í¬¡£ ×èÈûÓë·Ç×èÈû¹Ø×¢·½·¨Ö´ÐÐʱµ±Ç°Ï̵߳Ä״̬£¬¶øÍ¬²½ÓëÒì²½Ôò¹Ø×¢·½·¨µ÷Óýá¹ûµÄ֪ͨ»úÖÆ¡£ÒòΪÊÇ´Ó²»Í¬½Ç¶ÈÃèÊö·½·¨µÄµ÷Óùý³Ì£¬ËùÒÔÕâÁ½×é¸ÅÄîÒ²¿ÉÒÔÏ໥×éºÏ£¬¼´½«Ïß³Ì״̬ºÍ֪ͨ»úÖÆ½øÐÐ×éºÏ¡£ÀýÈçJDK1.3¼°ÒÔǰµÄBIOÊÇͬ²½×èÈûģʽ£¬JDK1.4·¢²¼µÄNIOÊÇͬ²½·Ç×èÈûģʽ£¬JDK1.7·¢²¼µÄNIO.2ÊÇÒì²½·Ç×èÈûģʽ¡£
¸úÃüÁîʽ±à³ÌÒ»Ñù£¬Í¬²½±à³ÌÒ²ÊÇĿǰ±»¹ã·º²ÉÓõĴ«Í³±à³Ì·½Ê½¡£Í¬²½±à³ÌµÄÓŵãÊÇ´úÂë¼òµ¥²¢ÇÒÈÝÒ×Àí½â£¬´úÂë°´ÕÕÏȺó˳ÐòÒÀ´ÎÖ´ÐУ»È±µãÊÇCPUÀûÓÃÂʷdz£µÍ£¬´ó²¿·Öʱ¼ä¶¼°×°×ÀË·ÑÔÚÁËIOµÈ´ýÉÏ¡£
Òì²½±à³Ìͨ¹ý³ä·ÖÀûÓÃCPU×ÊÔ´²¢ÐÐÖ´ÐÐÈÎÎñ£¬ ÔÚÖ´ÐÐʱ¼äºÍ×ÊÔ´ÀûÓÃÂÊÉÏÔ¶Ô¶¸ßÓÚͬ²½·½Ê½¡£¾Ù¸öÀý×ÓÀ´Ëµ£¬¶ÔÓÚÒ»¸ö10ºË·þÎñÆ÷£¬Ê¹ÓÃͬ²½·½Ê½×¥È¡10¸öÍøÒ³£¬Ã¿¸öÍøÒ³ºÄʱ1Ã룬Ôò×ܺÄʱΪ10Ã룻Èç¹û²ÉÓÃÒì²½·½Ê½£¬10¸öץȡÈÎÎñ·Ö±ðÔÚ¸÷×ÔµÄÏß³ÌÉÏÖ´ÐУ¬×ܺÄʱֻÓÐ1Ãë¡£ ¹¹½¨·´Ó¦Ê½ÏµÍ³²¢·ÇÒ×Ê£¬ÓÈÆäÊÇÕë¶ÔÒÅÁôϵͳ½øÐиÄÔ죬Õ⽫»áÊÇÒ»¸ö½ÏΪÂþ³¤µÄ¹ý³Ì¡£·´Ó¦Ê½¼Ü¹¹µÄºËÐÄ˼ÏëÊÇÒì²½·Ç×èÈûµÄ·´Ó¦Ê½Á÷£¬×÷Ϊ¹ý¶É½×¶Î£¬ÎÒÃÇ¿ÉÒÔÑ¡ÔñÏȶÔϵͳ½øÐÐÍêÈ«Òì²½»¯Öع¹£¬Îª½øÒ»²½Ïò·´Ó¦Ê½¼Ü¹¹Ñݽøµì¶¨»ù´¡¡£½ÓÏÂÀ´£¬ÎÒÃǽ«ÏÈ·ÖÎöÒ»¸ö´«Í³µÄͬ²½Ê¾Àý£¬È»ºóÕë¶Ô¸ÃʾÀý½øÐÐÒì²½»¯Öع¹¡£
2.3 ͬ²½±à³ÌʾÀý
¼ÙÉèÎÒÃÇҪʵÏÖÒ»¸ö²éѯÊÖ»úÌײÍÓà¶îµÄ·½·¨£¬ ¸Ã·½·¨½ÓÊÜÒ»¸öÊÖ»úºÅ²ÎÊý£¬·µ»Ø¸ÃÊÖ»úºÅµÄÌײÍÓà¶îÐÅÏ¢£¬ °üÀ¨Ê£Óàͨ»°Ê±¼ä¡¢Ê£Óà¶ÌÐÅÊýÁ¿ºÍÊ£ÓàÍøÂçÁ÷Á¿¡£ ÓÉÓÚ²éѯÌײÍÓà¶îÐèÒªÁ¬Ðø·¢ÆðÈý´Îͬ²½×èÈûµÄÊý¾Ý¿â²éѯÇëÇó£¬ËùÒÔÔÚʵÏÖÖÐÐèÒªÀûÓûº´æÌá¸ß¶ÁÈ¡ÐÔÄÜ£¬ ´úÂëÈçÏ£º
private PhonePlanCache
cache;
public PhonePlan retrievePhonePlan (String phoneNo)
{
PhonePlan plan = cache.get(phoneNo);
if (plan != null) {
return plan;
}
Long leftTalk = readLeftTalk(phoneNo);
Long leftText = readLeftText(phoneNo);
Long leftData = readLeftData(phoneNo);
return new PhonePlan (leftTalk, leftText, leftData);
} |
Ê×ÏÈÎÒÃǼì²éÊÇ·ñ¿ÉÒÔÖ±½Ó´Ó»º´æÖжÁÈ¡ÌײÍÓà¶îÐÅÏ¢£¬Èç¹û¿ÉÒÔÔòÖ±½Ó·µ»Ø£¬ ·ñÔòÁ¬Ðø·¢ÆðÈý´Îͬ²½×èÈûµÄÔ¶³Ìµ÷Ó㬠´ÓÊý¾Ý¿âÖÐÒÀ´Î¶Áȡͨ»°Óà¶î¡¢¶ÌÐÅÓà¶îºÍÁ÷Á¿Óà¶î¡£´úÂëÂß¼·Ç³£¼òµ¥£¬µ«ÊÇÓÉÓÚͬ²½×èÈû´úÂë¶ÔÏ̳߳ØÒÀÀµ·Ç³£ÑÏÖØ£¬½ÓÏÂÀ´ÎÒÃÇ»¹ÐèÒª¸ù¾ÝSLA¹ÀËãÏ̳߳غÍÁ¬½Ó³Ø´óС¡£¹ÀËãµÄ¹ý³Ì²¢²»ÈÝÒ×£¬ºÃÔÚÎÒÃÇÓÐÀûÌØ¶û·¨Ôò¡£
1954Ä꣬ John Little»ùÓڵȺòÀíÂÛÌá³öÁËÀûÌØ¶û·¨Ôò(Little's law)£º ÔÚÒ»¸öÎȶ¨µÄϵͳÖУ¬ÏµÍ³¿ÉÒÔͬʱ´¦ÀíµÄÇëÇóÊýÁ¿L£¬ µÈÓÚÇëÇóµ½´ïµÄƽ¾ùËÙ¶È ¦Ë ³ËÒÔÇëÇóµÄƽ¾ù´¦Àíʱ¼äW£¬ ¼´£º
L = ¦Ë * W
Õâ¸ö·¨ÔòͬÑù¿ÉÒÔÓÃÀ´¼ÆËãÏ̳߳غÍÁ¬½Ó³Ø´óС¡£ ÀýÈçϵͳÿÃë½ÓÊÕ1000¸öÇëÇó£¬Ã¿¸öÇëÇóµÄƽ¾ù´¦Àíʱ¼äÊÇ10ms£¬ ÔòºÏÊʵÄÊý¾Ý¿âÁ¬½Ó³Ø´óСӦ¸ÃΪ10¡£ Ò²¾ÍÊÇ˵ϵͳ¿ÉÒÔͬʱ´¦Àí10¸öÇëÇó¡£ ´Ó³¤Ê±¼äÀ´¿´£¬ÏµÍ³Æ½¾ù»áÓÐ10¸öÏß³ÌÔڵȴýÊý¾Ý¿âÁ¬½ÓÉϵÄÏìÓ¦¡£ µ«ÊÇÐèҪעÒâµÄÊÇ£¬ÀûÌØ¶û·¨ÔòÖ»ÊÊÓÃÓÚÒ»¸öÎȶ¨ÏµÍ³£¬ ÎÞ·¨´¦Àí·åÖµÇé¿ö£¬ ¶øÍ¨³£ÏµÍ³ÇëÇóÊýÁ¿µÄ·åÖµ»á±Èƽ¾ùÖµ¸ßºÜ¶à¡£¼ÙÉèΪÁËÓ¦¸¶·åÖµÇé¿ö£¬ÎÒÃǽ«Ï̳߳شóСµ÷ÕûΪ50£¬ ÓÉÓÚÁ¬½Ó³Ø´óСÈÔΪ10£¬ËùÒԻᵼÖ´óÁ¿Ïß³ÌÔڵȴý¿ÉÓÃÁ¬½Ó£¬ ÎÒÃÇÐèÒªÔÙ´ÎÔö´óÁ¬½Ó³Ø´óСÒÔ¸ÄÉÆÏµÍ³ÐÔÄÜ¡£Í¨³£¾¹ýÈç´Ë·´¸´µ÷ÕûºóµÄ²ÎÊýÒѾÑÏÖØÆ«ÀëÁËÀûÌØ¶û·¨Ôò£¬ µ¼ÖÂϵͳÐÔÄÜÑÏÖØÏ½µ£¬Ôڸ߲¢·¢³¡¾°Ï£¬Èç¹ûÍøÂçÉÔÓж¶¶¯»òÊý¾Ý¿âÉÔÓÐÑÓ³Ù£¬Ôò»áµ¼ÖÂ˲¼ä»ýѹ´óÁ¿ÇëÇó£¬ Èç¹ûûÓÐÓÐЧµÄÓ¦¶Ô´ëÊ©£¬ÏµÍ³½«ÃæÁÙ̱»¾·çÏÕ¡£
2.4 ͬ²½±à³ÌÃæÁÙµÄÌôÕ½
´«Í³Ó¦ÓÃͨ³£»ùÓÚServletÈÝÆ÷½øÐв¿Ê𣬶øServletÊÇ»ùÓÚÏ̵߳ÄÇëÇó´¦ÀíÄ£ÐÍ¡£´ÓÉÏÎĵÄÌÖÂÛÖÐÎÒÃÇ·¢ÏÖ£¬Í¨³£ÐèÒªÉèÖÃÒ»¸ö½Ï´óµÄÏ̳߳ØÒÔ»ñµÃ½ÏºÃµÄÐÔÄÜ£¬½Ï´óµÄÏ̳߳ػᵼÖÂÒÔÏÂÈý¸öÎÊÌ⣺
¶îÍâµÄÄڴ濪Ïú¡£ ÔÚJavaÖУ¬Ã¿¸öÏ̶߳¼ÓÐ×Ô¼ºµÄÕ»¿Õ¼ä£¬Ä¬ÈÏÊÇ1MB¡£Èç¹ûÉèÖÃÏ̳߳شóСΪ200£¬ÔòÓ¦ÓÃÔÚÆô¶¯Ê±ÖÁÉÙÐèÒª200MÄڴ棬һ·½ÃæÔì³ÉÁËÄÚ´æÀË·Ñ£¬ÁíÒ»·½ÃæÒ²µ¼ÖÂÓ¦ÓÃÆô¶¯±äÂý¡£ÊÔÏëһϣ¬Èç¹ûͬʱ²¿Êð1000¸ö½Úµã£¬ÕâЩÎÊÌ⽫»á±»·Å´ó1000±¶¡£
CPUÀûÓÃÂʵ͡£ ÓÐÁ½¸ö·½ÃæÔÒò»áµ¼Ö¼«µÍµÄCPUÀûÓÃÂÊ¡£Ò»·½ÃæÊÇÔÚOracle JDK 1.2°æ±¾Ö®ºó£¬ËùÓÐÆ½Ì¨µÄJVMʵÏÖ¶¼Ê¹ÓÃ1:1Ïß³ÌÄ£ÐÍ(SolarisÊǸöÌØÀý)£¬ÕâÒâζ×ÅÒ»¸öJavaÏ̻߳ᱻӳÉäµ½Ò»¸öÇáÁ¿¼¶½ø³ÌÉÏ£¬¶øÓÐЧµÄÇáÁ¿¼¶½ø³ÌÊýÁ¿È¡¾öÓÚCPUµÄ¸öÊýÒÔ¼°ºËÊý¡£Èç¹ûJavaµÄÏß³ÌÊýÁ¿Ô¶´óÓÚÓÐЧµÄÇáÁ¿¼¶½ø³ÌÊýÁ¿£¬ÔòƵ·±µÄÏß³ÌÉÏÏÞÎÄÇл»»áÀË·Ñ´óÁ¿CPUʱ¼ä£» ÁíÒ»·½Ã棬ÓÉÓÚ´«Í³µÄÔ¶³Ì²Ù×÷»òIO²Ù×÷¾ùΪ×èÈû²Ù×÷£¬»áµ¼ÖÂÖ´ÐÐÏ̱߳»¹ÒÆð´Ó¶øÎÞ·¨Ö´ÐÐÆäËûÈÎÎñ£¬´ó´ó½µµÍÁËCPUµÄÀûÓÃÂÊ¡£
×ÊÔ´¾ºÕù¼¤ÁÒ¡£ µ±Ôö´óÏß³Ì³Øºó£¬ÆäËûµÄ¹²Ïí×ÊÔ´±ã»á³ÉΪÐÔÄÜÆ¿¾±£¬ÈçÊý¾Ý¿âÁ¬½Ó³Ø×ÊÔ´¡£Èç¹û´æÔÚ¹²Ïí×ÊÔ´Æ¿¾±£¬¼´Ê¹ÉèÖÃÔÙ´óµÄÏ̳߳أ¬Ò²ÎÞ·¨ÓÐЧµØÌáÉýÐÔÄÜ¡£´Ëʱ»áµ¼Ö¶à¸öÏ߳̾ºÕùÊý¾Ý¿âÁ¬½Ó£¬ ʹµÃÊý¾Ý¿âÁ¬½Ó³ÉΪϵͳƿ¾±¡£
³ýÁËÉÏÃæÕâЩÎÊÌ⣬ͬ²½±à³Ì»¹»áÉî¿ÌµØÓ°Ïìµ½ÎÒÃǵļܹ¹¡£
¼ÙÉèÎÒÃÇ×¼±¸¿ª·¢Ò»¸öµ¥µãµÇ¼΢·þÎñ£¬Î¢·þÎñ¿ò¼ÜʹÓà Dubbo 2.x£¬¸Ã°æ±¾ÉÐδ֧³Ö·´Ó¦Ê½±à³Ì£¬Î¢·þÎñ½Ó¿ÚÖ®¼äµ÷ÓÃÈÔÈ»ÊÇͬ²½×èÈû·½Ê½¡£ ¼ÙÉèÎÒÃÇÐèҪʵÏÖÈçÏÂÁ½¸ö½Ó¿Ú£º
Óû§µÇ¼½Ó¿Ú
ÁîÅÆÑéÖ¤½Ó¿Ú
¶ÔÓÚÓû§µÇ¼½Ó¿Ú£¬ÓÉÓÚÐèÒª¶à´Î·ÃÎÊÊý¾Ý¿â»ò»º´æ£¬²¢ÇÒÐèҪʹÓÃArgon2µÈÂý¹þÏ£Ëã·¨½øÐÐÃÜÂëУÑ飬µ¼ÖÂÆ½¾ùÏìӦʱ¼ä½Ï³¤£¬Ô¼Îª500ºÁÃë¡£¶ø¶ÔÓÚÁîÅÆÑéÖ¤½Ó¿Ú£¬ÓÉÓÚÖ»ÐèÒª×ö¼òµ¥µÄÇ©ÃûУÑ飬ËùÒÔÆ½¾ùÏìӦʱ¼ä½Ï¶Ì£¬Ô¼Îª5ºÁÃë¡£ ¼ÙÉèÓÉÓÚÒµÎñÐèÒª£¬Óû§µÇ¼½Ó¿ÚµÄÐÔÄÜÖ¸±êÖ»ÐèÒª´ïµ½1000tps¼´¿É£¬¶øÁîÅÆÑéÖ¤½Ó¿ÚµÄÐÔÄÜÖ¸±êÔòÐèÒª´ïµ½100,000tps¡£
ͨ³£À´Ëµ£¬ÕâÁ½¸ö½Ó¿Ú»áÔÚͬһ¸ö΢·þÎñÀàÖÐʵÏÖ£¬Ò²Í¨³£»á±»·¢²¼µ½Í¬Ò»¸öÈÝÆ÷ÖжÔÍâÌṩ·þÎñ¡£ÎªÁËÂú×ãÒµÎñÐèÒª£¬ÎÒÃÇÏÈÀ´ËãÒ»ÏÂÐèÒª¶àÉÙÓ²¼þ³É±¾£¿ ΪÁ˼ò»¯ÌÖÂÛ£¬ÎÒÃÇÈÏΪÁîÅÆÑéÖ¤½Ó¿ÚÎÞÐèÓ²¼þ³É±¾£¬Ö»¹Ø×¢Óû§µÇ¼½Ó¿Ú¼´¿É¡£¸ù¾ÝÀûÌØ¶û·¨Ôò£¬ ×ÜÏß³ÌÊýÁ¿(L) = TPS(¦Ë)*ƽ¾ùÏìӦʱ¼ä(W)£¬ ¼´£º
×ÜÏß³ÌÊýÁ¿(L) = (1000*0.5) = 500
¼ÙÉèÿ¸ö¼ÆËã½ÚµãÅäÖÃΪ4C8G£¬ ÄÇôһ¹²ÐèÒª (500/4)=125̨¼ÆËã½Úµã¡£ ÇøÇøµÄ1000tps¾¹È»ÐèÒª125̨¼ÆËã½Úµã£¡ÄãÒÔΪÕâ¾ÍÍêÁËÂ𣿠1000tpsÖ»ÊÇÈÕ³£µÄÇëÇóѹÁ¦£¬Èç¹û¿¼ÂÇ·åÖµÇé¿öÄØ£¿¼ÙÉè·åÖµÇëÇóÊÇ10, 000tps£¬²¢ÇÒ»á³ÖÐø10Ã룬 ÄÇôÔÚÕâ10ÃëÄÚϵͳҲ¿ÉÒÔ¿´×öÊÇÎȶ¨×´Ì¬£¬ ÄÇô¸ù¾ÝÀûÌØ¶û·¨Ôò£¬¾ÍÐèÒª²¿Êð1250̨¼ÆËã½Úµã¡£ »¹Óиü»µµÄÇé¿ö£¬Èç¹ûij¸ö½ÚµãÓÉÓÚÊý¾Ý¿âÑÓ³Ù»òÍøÂç¶¶¶¯µÈÇé¿ö£¬µ¼ÖÂÓû§µÇ¼ÇëÇó»ýѹ£¬ÔòÓû§µÇ¼ÇëÇó»áºÄ¾¡ËùÓÐÇëÇó´¦ÀíỊ̈߳¬µ¼ÖÂÔ±¾¿ÉÒÔ¿ìËÙÏìÓ¦µÄÁîÅÆÑéÖ¤ÇëÇóÎÞ·¨±»¼°Ê±´¦Àí£¬¶øÁîÅÆÑéÖ¤½Ó¿ÚµÄtpsÊÇ100,000£¬ÕâÒâζ×Å1ÃëÖӾͻá»ýѹ100,000¸öÁîÅÆÑéÖ¤ÇëÇó£¬ ÏµÍ³ÒѾ´¦ÔÚΣÏÕ±ßÔµ£¬ËæÊ±¶¼»á±ÀÀ£¡£
ΪÁ˽â¾öÁîÅÆÑéÖ¤½Ó¿ÚµÄ¿ìËÙÏìÓ¦ÎÊÌ⣬ÎÒÃÇÖ»Äܵ÷Õû¼Ü¹¹£¬½«µÇ½ºÍÑéÖ¤²ð·Ö³ÉÁ½¸öµ¥¶ÀµÄ΢·þÎñ£¬²¢ÇÒ¸÷×Ô²¿Êðµ½¶ÀÁ¢µÄÈÝÆ÷ÖС£ÕâÑùÊDz»ÊǾÍÍòÊ´ó¼ªÁËÄØ£¿ºÜ²»ÐÒ£¬µ¥µãµÇ¼ÓÀ´ÁËÒ»¸öÐÂÐèÇó£¬Õë¶ÔÔ±¹¤ÕË»§ÐèÒªÔ¶³Ìµ÷ÓÃLDAP½øÐÐÈÏÖ¤£¬ ¶øÔ¶³Ìµ÷ÓÃLDAPÒ²ÊÇÒ»¸öͬ²½×èÈû²Ù×÷£¬ÕâÒâζ×Åÿһ¸öLDAPÔ¶³Ìµ÷Óö¼»á¹ÒÆðÒ»¸öỊ̈߳¬´óÁ¿µÄÔ¶³Ìµ÷ÓÃÒ²»áºÄ¾¡ËùÓÐỊ̈߳¬ÕâЩ±»¹ÒÆðµÄÏß³Ìɶ¶¼²»×ö£¬¾ÍÔÚÄÇɵɵµÄµÈ´ýÔ¶³ÌÏìÓ¦¡£ÕâÆäʵ¾ÍÊÇ΢·þÎñµ÷ÓÃÁ´Ñ©±ÀµÄ×ï¿ý»öÊס£Á½¸ö΢·þÎñÖ®¼äµ÷ÓÃÒѾÈç´Ë¼¬ÊÖÁË£¬ÄÇÈç¹ûµ÷ÓÃÁ´ÉÏÓÐ10¸öÉõÖÁ¸ü¶àµÄ΢·þÎñµ÷ÓÃÄØ£¿ Äǽ«ÊÇÒ»³¡Ø¬ÃΣ¡
ÆäʵËùÓÐÎÊÌâµÄ¸ùÔ´¶¼¿ÉÒÔ¹é½áΪ´«Í³µÄͬ²½×èÈû±à³Ì·½Ê½¡£ÓÈÆäÊÇÔÚ΢·þÎñ³¡¾°Ï£¬Ëæ×ŵ÷ÓÃÁ´³¤¶ÈµÄ²»¶ÏÔö³¤£¬·çÏÕÒ²½«Ô½À´Ô½¸ß£¬ ÆäÖÐÈκÎÒ»¸ö½Úµãͬ²½×èÈû²Ù×÷¶¼»áµ¼ÖÂÆäÏÂÓÎËùÓнڵãÏ̱߳»×èÈû£¬Èç¹ûÎÊÌâ½ÚµãµÄÇëÇó²úÉú»ýѹ£¬Ôò»áµ¼ÖÂËùÓÐÏÂÓνڵãÏ̱߳»ºÄ¾¡£¬Õâ¾ÍÊÇ¿ÉŵÄÑ©±À¡£
2.5 Òì²½±à³ÌʾÀý
ÎÒÃÇ˵Òì²½±à³Ìͨ³£ÊÇÖ¸Òì²½·Ç×èÈûµÄ±à³Ì·½Ê½£¬¼´ÒªÇóϵͳÖв»ÄÜÓÐÈκÎ×èÈûÏ̵߳ĴúÂë¡£ÔÚÏÖʵÇé¿öÏ£¬ÏëʵÏÖÍêÈ«µÄÒì²½·Ç×èÈû·Ç³£À§ÄÑ£¬ ÒòΪ»¹ÓкܶàµÚÈý·½µÄ¿â»òÇý¶¯ÈÔÈ»²ÉÓÃͬ²½×èÈûµÄ±à³Ì·½Ê½¡£ÎÒÃÇÐèҪΪÕâЩ¿â»òÇý¶¯Ö¸¶¨¶ÀÁ¢µÄÏ̳߳أ¬ÒÔÃâÓ°Ïìµ½ÆäËû·þÎñ½Ó¿Ú¡£
ÀûÓÃJava 8ÌṩµÄCompletableFutureºÍLambdaÁ½¸öÌØÐÔ£¬ÎÒÃǶÔ2.2½ÚµÄʾÀý½øÐÐÒì²½»¯¸ÄÔ죬¸ÄÔìºó´úÂëÈçÏ£º
private PhonePlanCache
cache;
public CompletableFuture<PhonePlan> retrievePhonePlan(String
phoneNo) {
PhonePlan cachedPlan = cache.get(phoneNo);
if (cachedPlan != null) {
return CompletableFuture. completedFuture(cachedPlan);
}
CompletableFuture<Long> leftTalkFuture =
readLeftTalk(phoneNo);
CompletableFuture<Long> leftTextFuture =
readLeftText(phoneNo);
CompletableFuture<Long> leftDataFuture =
readLeftData(phoneNo);
CompletableFuture<PhonePlan> planFuture
=
leftTalkFuture.thenCombine
(leftTextFuture, (leftTalk, leftText) ->{
PhonePlan plan = new PhonePlan();
plan.setLeftTalk(leftTalk);
plan.setLeftText(leftText);
return plan;
}).thenCombine(leftDataFuture, www.xinyiylzc.cn
(plan, leftData) -> {
plan.setLeftData(leftData);
return plan;
});
return planFuture;
} |
ÎÒÃÇ·¢ÏÖËäÈ»Òì²½±à³Ì¿ÉÒÔ»ñµÃÐÔÄÜÉϵÄÌáÉý£¬µ«ÊDZàÂ븴ÔÓ¶ÈÈ´ÌáÉýÁ˺ܶ࣬²¢ÇÒÈç¹ûÒì²½µ÷ÓÃÁ´Ì«³¤£¬»¹ÈÝÒ×µ¼Ö»ص÷µØÓü¡£
ES2017 ÔÚ±à³ÌÓïÑÔ¼¶±ðÌṩÁËasync/await¹Ø¼ü×ÖÓÃÓÚ¼ò»¯Òì²½±à³Ì£¬Èÿª·¢ÕßÒÔͬ²½µÄ·½Ê½±àдÒì²½´úÂ룬ÀýÈ磺
const leftTalk
= await readLeftTalkPromise (www.ping2yl.com phoneNo);
const leftText = await readLeftTextPromise (www.huanhua2zhuc.cn
phoneNo);
const leftData = await readLeftDataPromise (www.hdptzc.cn
phoneNo);
const phonePlan = new PhonePlan (leftTalk, leftText,
www.yunzeyle.cn leftData); |
ÔÚScalaÖÐʹÓà for Óï¾äÒ²¿ÉÒÔ¼ò»¯Òì²½±à³Ì£¬ÀýÈ磺
for {
leftTalk <- leftTalkFuture
leftText <- leftTextFuture
leftData <- leftDataFuture
} yield new PhonePlan (leftTalk, leftText, leftData) |
¿´µ½ÔÚÆäËüÓïÑÔÖÐÒì²½±à³ÌÈç´Ë¼òµ¥£¬ÊDz»ÊǺÜÏÛĽ£¿ ±ð¼±£¬ ÔÚÏÂһƪÎÄÕÂÖУ¬ÎÒÃǽ«»á¿´µ½ÈçºÎÀûÓ÷´Ó¦Ê½±à³Ì¼ò»¯Òì²½µ÷ÓÃÎÊÌâ¡£
3 ×ܽá
±¾ÎÄͨ¹ýÁ½²¿·ÖÄÚÈÝΪ´ó¼Ò½éÉÜÁË·´Ó¦Ê½µÄ»ù±¾¸ÅÄî¡£µÚÒ»²¿·Ö½éÉÜʲôÊÇ·´Ó¦Ê½£¬°üÀ¨·´Ó¦Ê½µÄ·¢Õ¹ÀúÊ·ºÍһЩÏà¹ØÏîÄ¿¡£µÚ¶þ²¿·Ö½éÉÜΪʲôҪ·´Ó¦Ê½£¬Í¨¹ýÒ»¸ö´«Í³µÄ±à³ÌʾÀýÏò´ó¼Ò²ûÊöͬ²½±à³ÌËùÃæÁÙµÄÎÊÌâºÍÌôÕ½£¬ÓÈÆäÔÚ΢·þÎñ³¡¾°Ï£¬Ãæ¶Ô³ÉǧÉÏÍòµÄ΢·þÎñ½Ó¿ÚÒÔ´í×Û¸´Ôӵĵ÷ÓÃÁ´£¬ÎªÁ˹æ±Ü¿ÉÄܵ¼ÖµÄÑ©±À·çÏÕ£¬ÎÒÃDz»µÃ²»¶ÔÒÑÓеļܹ¹½øÐÐÎÞÒâÒå¸ÄÔ죬²»½öÔö¼Ó¿ª·¢³É±¾£¬¶øÇÒµ¼Ö²¿ÊðºÍÔËάÄѶÈÔö¼Ó£¬Í¬²½±à³Ì·½Ê½ÒѾÉî¿ÌµØÓ°Ïìµ½ÁËÎÒÃǵļܹ¹¡£µ«ÊDz»¹ÜÔõô˵£¬·´Ó¦Ê½¸ÄÔìÊÇÒ»¸ö³¤ÆÚµÄ¹ý³Ì£¬ ÔÚÕâ¸ö¹ý³ÌÖУ¬ÎÒÃÇÐèÒª²»¶ÏµØÍêÉÆ»ù´¡ÉèÊ©£¬Í¬Ê±Ò²Òª×¢ÖضԿª·¢ÈËÔ±µÄÅàÑø£¬ ÒòΪ·´Ó¦Ê½±à³ÌÊǶԴ«Í³·½Ê½µÄÒ»´Î±ä¸ï£¬±à³ÌģʽºÍ˼ά¶¼ÐèÒª½øÐÐת»»£¬Õâ¶ÔÓÚ¿ª·¢ÈËÔ±À´ËµÍ¬ÑùÊÇÒ»´ÎÌôÕ½¡£×ªÐÍËäȻʹ¿à£¬µ«Êdzɹ¦ÍɱäÖ®ºó±ã»áÓÀ´ÐÂÉú¡£
|