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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ActiveMQÏûÏ¢´«ËÍ»úÖÆÒÔ¼°ACK»úÖÆÏê½â
 
×÷ÕߣºQING
  2986  次浏览      28
 2020-7-10
 
±à¼­ÍƼö:
ÎÄÕÂÖ÷Òª¼òµ¥µÄ½éÉÜÁËActiveMQÖÐÏûÏ¢´«ËÍ»úÖÆ£¬»¹ÓÐJMSÖÐACK²ßÂÔ£¬Öصã·ÖÎöÁËoptimizeACKµÄ²ßÂÔ£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
À´×ÔÓÚ΢ÐŹ«ÖÚºÅ-¼Ü¹¹Ê¦£¬,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­¡¢ÍƼö¡£

AcitveMQÊÇ×÷ΪһÖÖÏûÏ¢´æ´¢ºÍ·Ö·¢×é¼þ£¬Éæ¼°µ½clientÓëbroker¶ËÊý¾Ý½»»¥µÄ·½·½ÃæÃ棬Ëü²»½öÒªµ£±£ÏûÏ¢µÄ´æ´¢°²È«ÐÔ£¬»¹ÒªÌṩ¶îÍâµÄÊÖ¶ÎÀ´È·±£ÏûÏ¢µÄ·Ö·¢Êǿɿ¿µÄ¡£

Ò». ActiveMQÏûÏ¢´«ËÍ»úÖÆ

Producer¿Í»§¶ËʹÓÃÀ´·¢ËÍÏûÏ¢µÄ£¬ Consumer¿Í»§¶ËÓÃÀ´Ïû·ÑÏûÏ¢£»ËüÃǵÄЭͬÖÐÐľÍÊÇActiveMQ broker,brokerÒ²ÊÇÈÃproducerºÍconsumerµ÷Óùý³Ì½âñîµÄ¹¤¾ß£¬×îÖÕʵÏÖÁËÒì²½RPC/Êý¾Ý½»»»µÄ¹¦ÄÜ¡£Ëæ×ÅActiveMQµÄ²»¶Ï·¢Õ¹£¬Ö§³ÖÁËÔ½À´Ô½¶àµÄÌØÐÔ£¬Ò²½â¾ö¿ª·¢ÕßÔÚ¸÷ÖÖ³¡¾°ÏÂʹÓÃActiveMQµÄÐèÇó¡£±ÈÈçproducerÖ§³ÖÒì²½µ÷Óã»Ê¹ÓÃflow control»úÖÆÈÃbrokerЭͬconsumerµÄÏû·ÑËÙÂÊ£»consumer¶Ë¿ÉÒÔʹÓÃprefetchACKÀ´×î´ó»¯ÏûÏ¢Ïû·ÑµÄËÙÂÊ£»Ìṩ"ÖØ·¢²ßÂÔ"µÈÀ´Ìá¸ßÏûÏ¢µÄ°²È«ÐԵȡ£ÔÚ´ËÎÒÃDz»Ïêϸ½éÉÜ¡£

Ò»ÌõÏûÏ¢µÄÉúÃüÖÜÆÚÈçÏÂ:

ͼƬÖмòµ¥µÄÃèÊöÁËÒ»ÌõÏûÏ¢µÄÉúÃüÖÜÆÚ,²»¹ýÔÚ²»Í¬µÄ¼Ü¹¹»·¾³ÖÐ,messageµÄÁ÷¶¯ÐпÉÄܸü¼Ó¸´ÔÓ.½«ÔÚÉÔºóÓйØbrokerµÄ¼Ü¹¹ÖÐÏê½â..Ò»ÌõÏûÏ¢´Óproducer¶Ë·¢³öÖ®ºó£¬Ò»µ©±»brokerÕýÈ·±£´æ£¬ÄÇôËü½«»á±»consumerÏû·Ñ£¬È»ºóACK£¬broker¶Ë²Å»áɾ³ý£»²»¹ýµ±ÏûÏ¢¹ýÆÚ»òÕß´æ´¢É豸Òç³öʱ£¬Ò²»áÖÕ½áËü¡£

ÕâÊÇÒ»Õźܸ´ÔÓ£¬¶øÇÒÓÐЩÁèÂÒµÄͼƬ£»ÕâÕÅͼƬÖмòµ¥µÄÃèÊöÁË:1)producer¶ËÈçºÎ·¢ËÍÏûÏ¢ 2) consumer¶ËÈçºÎÏû·ÑÏûÏ¢ 3) broker¶ËÈçºÎµ÷¶È¡£Èç¹ûÓÃÎÄ×ÖÀ´ÃèÊöͼʾÖеĸÅÄ¿ÖÅÂÒ»ÑÔÄѾ¡¡£Í¼Ê¾ÖУ¬Ìá¼°µ½prefetchAck£¬ÒÔ¼°ÏûϢͬ²½¡¢Òì²½·¢Ë͵Ļù±¾Âß¼­£»Õâ¶ÔÄãÁ˽âÏÂÎÄÖеÄACK»úÖÆ½«ÓкܴóµÄ°ïÖú¡£

¶þ. optimizeACK

"¿ÉÓÅ»¯µÄACK"£¬ÕâÊÇActiveMQ¶ÔÓÚconsumerÔÚÏûÏ¢Ïû·Ñʱ£¬¶ÔÏûÏ¢ACKµÄÓÅ»¯Ñ¡ÏҲÊÇconsumer¶Ë×îÖØÒªµÄÓÅ»¯²ÎÊýÖ®Ò»£¬Äã¿ÉÒÔͨ¹ýÈçÏ·½Ê½¿ªÆô:

1) ÔÚbrokerUrlÖÐÔö¼ÓÈçϲéѯ×Ö·û´®£º

String brokerUrl = "tcp://localhost:61616?" +
"jms.optimizeAcknowledge=true" +
"&jms.optimizeAcknowledgeTimeOut=30000" +
"&jms.redeliveryPolicy.maximumRedeliveries=6";
ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory(brokerUrl);

2) ÔÚdestinationUriÖУ¬Ôö¼ÓÈçϲéѯ×Ö·û´®£º

String queueName = "test-queue?customer.prefetchSize=100";
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination queue = session.createQueue(queueName);

ÎÒÃÇÐèÒªÔÚbrokerUrlÖ¸¶¨optimizeACKÑ¡ÏÔÚdestinationUriÖÐÖ¸¶¨prefetchSize(Ô¤»ñÈ¡)Ñ¡ÏÆäÖÐbrokerUrl²ÎÊýÑ¡ÏîÊÇÈ«¾ÖµÄ£¬¼´µ±Ç°factoryÏÂËùÓеÄconnection/session/consumer¶¼»áĬÈÏʹÓÃÕâЩֵ£»¶ødestinationUriÖеÄÑ¡Ïֻ»áÔÚʹÓôËdestinationµÄconsumerʵÀýÖÐÓÐЧ£»Èç¹ûͬʱָ¶¨£¬brokerUrlÖеIJÎÊýÑ¡ÏîÖµ½«»á±»¸²¸Ç¡£optimizeAck±íʾÊÇ·ñ¿ªÆô¡°ÓÅ»¯ACK¡±£¬Ö»ÓÐÔÚΪtrueµÄÇé¿öÏ£¬prefetchSize(ÏÂÎÄÖн«»á¼òд³Éprefetch)ÒÔ¼°optimizeAcknowledgeTimeout²ÎÊý²Å»áÓÐÒâÒå¡£´Ë´¦ÐèҪעÒâ"optimizeAcknowledgeTimeout"Ñ¡ÏîÖ»ÄÜÔÚbrokerUrlÖÐÅäÖá£

prefetchÖµ½¨ÒéÔÚdestinationUriÖÐÖ¸¶¨£¬ÒòΪÔÚbrokerUrlÖÐÖ¸¶¨±È½Ï·±Ëö£»ÔÚbrokerUrlÖУ¬queuePrefetchSizeºÍtopicPrefetchSize¶¼ÐèÒªµ¥¶ÀÉ趨£º"&jms.prefetchPolicy .queuePrefetch = 12&jms . prefetchPolicy .topicPrefetch = 12"µÈÀ´Öð¸öÖ¸¶¨¡£

Èç¹ûprefetchACKΪtrue£¬ÄÇôprefetch±ØÐë´óÓÚ0£»µ±prefetchACKΪfalseʱ£¬Äã¿ÉÒÔÖ¸¶¨prefetchΪ0ÒÔ¼°ÈÎÒâ´óСµÄÕýÊý¡£²»¹ý£¬µ±prefetch=0ÊÇ£¬±íʾconsumer½«Ê¹ÓÃPULL(À­È¡)µÄ·½Ê½´Óbroker¶Ë»ñÈ¡ÏûÏ¢£¬broker¶Ë½«²»»áÖ÷¶¯pushÏûÏ¢¸øclient¶Ë£¬Ö±µ½client¶Ë·¢ËÍPullCommandʱ£»µ±prefetch>0ʱ£¬¾Í¿ªÆôÁËbroker pushģʽ£¬´ËºóÖ»Òªµ±client¶ËÏû·ÑÇÒACKÁËÒ»¶¨µÄÏûÏ¢Ö®ºó£¬»áÁ¢¼´push¸øclient¶Ë¶àÌõÏûÏ¢¡£

µ±consumer¶ËʹÓÃreceive()·½·¨Í¬²½»ñÈ¡ÏûϢʱ£¬prefetch¿ÉÒÔΪ0ºÍÈÎÒâÕýÖµ£»µ±prefetch=0ʱ£¬ÄÇôreceive()·½·¨½«»áÊ×ÏÈ·¢ËÍÒ»¸öPULLÖ¸Áî²¢×èÈû£¬Ö±µ½broker¶Ë·µ»ØÏûϢΪֹ£¬ÕâÒ²Òâζ×ÅÏûÏ¢Ö»ÄÜÖð¸ö»ñÈ¡(ÀàËÆÓÚRequest<->Response)£¬ÕâÒ²ÊÇActivemqÖÐPULLÏûϢģʽ£»µ±prefetch > 0ʱ£¬broker¶Ë½«»áÅúÁ¿push¸øclient Ò»¶¨ÊýÁ¿µÄÏûÏ¢(<= prefetch),client¶Ë»á°ÑÕâЩÏûÏ¢(unconsumedMessage)·ÅÈëµ½±¾µØµÄ¶ÓÁÐÖУ¬Ö»Òª´Ë¶ÓÁÐÓÐÏûÏ¢£¬ÄÇôreceive·½·¨½«»áÁ¢¼´·µ»Ø£¬µ±Ò»¶¨Á¿µÄÏûÏ¢ACKÖ®ºó£¬broker¶Ë»á¼ÌÐøÅúÁ¿pushÏûÏ¢¸øclient¶Ë¡£

µ±consumer¶ËʹÓÃMessageListenerÒì²½»ñÈ¡ÏûϢʱ£¬Õâ¾ÍÐèÒª¿ª·¢É趨µÄprefetchÖµ±ØÐë >=1,¼´ÖÁÉÙΪ1£»ÔÚÒì²½Ïû·ÑÏûϢģʽÖУ¬É趨prefetch=0,ÊÇÏà㣵ģ¬Ò²½«»ñµÃÒ»¸öException¡£

´ËÍ⣬ÎÒÃÇ»¹¿ÉÒÔbrokerUrlÖÐÅäÖá°redelivery¡±²ßÂÔ£¬±ÈÈçµ±Ò»ÌõÏûÏ¢´¦ÀíÒ쳣ʱ£¬broker¶Ë¿ÉÒÔÖØ·¢µÄ×î´ó´ÎÊý£»ºÍÏÂÎÄÖÐÌáµ½REDELIVERED_ACK_TYPE»¥ÏàЭͬ¡£µ±ÏûÏ¢ÐèÒªbroker¶ËÖØ·¢Ê±£¬consumer»áÊ×ÏÈÔÚ±¾µØµÄ¡°deliveredMessage¶ÓÁС±(ConsumerÒѾ­½ÓÊÕµ«»¹Î´È·ÈϵÄÏûÏ¢¶ÓÁÐ)ɾ³ýËü£¬È»ºóÏòbroker·¢ËÍ¡°REDELIVERED_ACK_TYPE¡±ÀàÐ͵ÄÈ·ÈÏÖ¸Ábroker½«»á°ÑÖ¸ÁîÖÐÖ¸¶¨µÄÏûÏ¢ÖØÐÂÌí¼Óµ½pendingQueue(ؽ´ý·¢Ë͸øconsumerµÄÏûÏ¢¶ÓÁÐ)ÖУ¬Ö±µ½ºÏÊʵÄʱ»ú£¬ÔÙ´Îpush¸øclient¡£

µ½Ä¿Ç°ÎªÖ¹£¬»òÐíÄãÖªµÀÁËoptimizeACKºÍprefethµÄ´ó¸ÅÒâÒ壬²»¹ýÎÒÃÇ¿ÉÄÜ»¹»áÓÐЩÒɻ󣡣¡optimizeACKºÍprefetchÅäºÏ£¬½«»á´ï³ÉÒ»¸ö¸ßЧµÄÏûÏ¢Ïû·ÑÄ£ÐÍ£ºÅúÁ¿»ñÈ¡ÏûÏ¢£¬²¢¡°ÑÓ³Ù¡±È·ÈÏ(ACK)¡£prefetch±í´ïÁË¡°ÅúÁ¿»ñÈ¡¡±ÏûÏ¢µÄÓïÒ壬broker¶ËÖ÷¶¯µÄÅúÁ¿push¶àÌõÏûÏ¢¸øclient¶Ë£¬×ܱÈclient¶à´Î·¢ËÍPULLÖ¸ÁîÈ»ºóbroker·µ»ØÒ»ÌõÏûÏ¢µÄ·½Ê½ÒªÓÅÐãºÜ¶à£¬Ëü²»½ö¼õÉÙÁËclient¶ËÔÚ»ñÈ¡ÏûϢʱ×èÈûµÄ´ÎÊýºÍ×èÈûµÄʱ¼ä£¬»¹Äܹ»´ó´óµÄ¼õÉÙÍøÂ翪֧¡£optimizeACK±í´ïÁË¡°ÑÓ³ÙÈ·ÈÏ¡±µÄÓïÒå(ACKʱ»ú)£¬client¶ËÔÚÏû·ÑÏûÏ¢ºóÔÝÇÒ²»·¢ËÍACK£¬¶øÊǰÑËü»º´æÏÂÀ´(pendingACK)£¬µÈµ½ÕâЩÏûÏ¢µÄÌõÊý´ïµ½Ò»¶¨·§ÖµÊ±£¬Ö»ÐèҪͨ¹ýÒ»¸öACKÖ¸Áî°ÑËüÃÇÈ«²¿È·ÈÏ£»Õâ±È¶ÔÿÌõÏûÏ¢¶¼Öð¸öÈ·ÈÏ£¬ÔÚÐÔÄÜÉÏÒªÌá¸ßºÜ¶à¡£Óɴ˿ɼû£¬prefetchÓÅ»¯ÁËÏûÏ¢´«Ë͵ÄÐÔÄÜ£¬optimizeACKÓÅ»¯ÁËÏûϢȷÈϵÄÐÔÄÜ¡£

µ±consumer¶ËÏûÏ¢Ïû·ÑµÄËÙÂʺܸß(Ïà¶ÔÓÚproducerÉú²úÏûÏ¢)£¬¶øÇÒÏûÏ¢µÄÊýÁ¿Ò²ºÜ´óʱ(±ÈÈçÏûÏ¢Ô´Ô´²»¶ÏµÄÉú²ú)£¬ÎÒÃÇʹÓÃoptimizeACK + prefetch½«»á¼«´óµÄÌáÉýconsumerµÄÐÔÄÜ¡£²»¹ý·´¹ýÀ´£º

1) Èç¹ûconsumer¶ËÏû·ÑËٶȺÜÂý(¶ÔÏûÏ¢µÄ´¦ÀíÊǺÄʱµÄ)£¬¹ý´óµÄprefetchSize£¬²¢²»ÄÜÓÐЧµÄÌáÉýÐÔÄÜ£¬·´¶ø²»ÀûÓÚconsumer¶ËµÄ¸ºÔؾùºâ(Ö»Õë¶Ôqueue)£»°´ÕÕÁ¼ºÃµÄÉè¼Æ×¼Ôò£¬µ±consumerÏû·ÑËٶȺÜÂýʱ£¬ÎÒÃÇͨ³£»á²¿Êð¶à¸öconsumer¿Í»§¶Ë£¬²¢Ê¹ÓýÏСµÄprefetch£¬Í¬Ê±¹Ø±ÕoptimizeACK£¬¿ÉÒÔÈÃÏûÏ¢ÔÚ¶à¸öconsumer¼ä¡°¸ºÔؾùºâ¡±(¼´¾ùÔȵķ¢Ë͸øÃ¿¸öconsumer)£»Èç¹û½Ï´óµÄprefetchSize£¬½«»áµ¼ÖÂbrokerÒ»´ÎÐÔpush¸øclient´óÁ¿µÄÏûÏ¢£¬µ«ÊÇÕâЩÏûÏ¢ÐèÒªºÜ¾Ã²ÅÄÜACK(ÏûÏ¢»ýѹ)£¬¶øÇÒÔÚclient¹ÊÕÏʱ£¬»¹»áµ¼ÖÂÕâЩÏûÏ¢µÄÖØ·¢¡£

2) Èç¹ûconsumer¶ËÏû·ÑËٶȺܿ죬µ«ÊÇproducer¶ËÉú³ÉÏûÏ¢µÄËÙÂʽÏÂý£¬±ÈÈçÉú²úÕß10ÃëÖÓÉú³É10ÌõÏûÏ¢£¬µ«ÊÇconsumerÒ»Ãë¾ÍÄÜÏû·ÑÍê±Ï£¬¶øÇÒÎÒÃÇ»¹²¿ÊðÁ˶à¸öconsumer£¡£¡ÕâÖÖ³¡¾°Ï£¬½¨Ò鿪ÆôoptimizeACK£¬µ«ÊÇÐèÒªÉèÖõÄprefetchSize²»Äܹý´ó£»ÕâÑù¿ÉÒÔ±£Ö¤Ã¿¸öconsumer¶¼ÄÜÓÐ"»î¸É"£¬·ñÔò½«»á³öÏÖÒ»¸öconsumer·Ç³£Ã¦Âµ£¬µ«ÊÇÆäËûconsumer¼¸ºõÊÕ²»µ½ÏûÏ¢¡£

3) Èç¹ûÏûÏ¢ºÜÖØÒª£¬ÌرðÊDz»Ô¸Òâ½ÓÊÕµ½¡±redelivery¡°µÄÏûÏ¢£¬ÄÇôÎÒÃÇÐèÒª½«optimizeACK=false£¬prefetchSize=1

¼ÈÈ»optimizeACKÊÇ¡±ÑÓ³Ù¡°È·ÈÏ£¬ÄÇô¾ÍÒýÈëÒ»ÖÖDZÔڵķçÏÕ£ºÔÚÏûÏ¢±»Ïû·ÑÖ®ºó»¹Ã»ÓÐÀ´µÃ¼°È·ÈÏʱ£¬client¶Ë·¢Éú¹ÊÕÏ£¬ÄÇôÕâЩÏûÏ¢¾ÍÓпÉÄÜ»á±»ÖØÐ·¢Ë͸øÆäËûconsumer£¬ÄÇôÕâÖÖ·çÏÕ¾ÍÐèÒªclient¶ËÄܹ»ÈÝÈÌ¡°Öظ´¡±ÏûÏ¢¡£

prefetchֵĬÈÏΪ1000£¬µ±È»Õâ¸öÖµ¿ÉÄÜÔںܶೡ¾°ÏÂÊÇÆ«´óµÄ£»ÎÒÃÇÔÝÇÒ²»¿¼ÂÇACKģʽ(²Î¼ûÏÂÎÄ)£¬Í¨³£Çé¿öÏ£¬ÎÒÃÇÖ»ÐèÒª¼òµ¥µÄͳ¼Æ³öµ¥¸öconsumerÿÃëµÄ×î´óÏû·ÑÏûÏ¢Êý¼´¿É£¬±ÈÈçÒ»¸öconsumerÿÃë¿ÉÒÔ´¦Àí100¸öÏûÏ¢£¬ÎÒÃÇÆÚÍûconsumer¶Ëÿ2ÃëÈ·ÈÏÒ»´Î£¬ÄÇôÎÒÃǵÄprefetchSize¿ÉÒÔÉèÖÃΪ100 * 2 /0.65´ó¸ÅΪ300¡£ÎÞÂÛÈçºÎÉ趨´ËÖµ£¬client³ÖÓеÄÏûÏ¢ÌõÊý×î´óΪ£ºprefetch + ¡°DELIVERED_ACK_TYPEÏûÏ¢ÌõÊý¡±(DELIVERED_ACK_TYPE²Î¼ûÏÂÎÄ)

¼´Ê¹µ±optimizeACKΪtrue£¬Ò²Ö»»áµ±sessionµÄACKģʽΪAUTO_ACKNOWLEDGEʱ²Å»áÉúЧ£¬¼´ÔÚÆäËûÀàÐ͵ÄACKģʽʱconsumer¶ËÈÔÈ»²»»á¡°ÑÓ³ÙÈ·ÈÏ¡±£¬¼´:

consumer.optimizeAck = connection.optimizeACK && session.isAutoAcknowledge()

µ±consumer.optimizeACKÓÐЧʱ£¬Èç¹û¿Í»§¶ËÒѾ­Ïû·Ñµ«ÉÐδȷÈϵÄÏûÏ¢(deliveredMessage)´ïµ½prefetch * 0.65£¬consumer¶Ë½«»á×Ô¶¯½øÐÐACK£»Í¬Ê±Èç¹ûÀëÉÏÒ»´ÎACKµÄʱ¼ä¼ä¸ô£¬ÒѾ­³¬¹ý"optimizeAcknowledgeTimout"ºÁÃ룬Ҳ»áµ¼ÖÂ×Ô¶¯½øÐÐACK¡£

´ËÍâ¼òµ¥µÄ²¹³äһϣ¬ÅúÁ¿È·ÈÏÏûϢʱ£¬Ö»ÐèÒªÔÚACKÖ¸ÁîÖÐÖ¸Ã÷¡°firstMessageId¡±ºÍ¡°lastMessageId¡±¼´¿É£¬¼´ÏûÏ¢Çø¼ä£¬ÄÇôbroker¶Ë¾ÍÖªµÀ´Ëconsumer(¸ù¾ÝconsumerIdʶ±ð)ÐèҪȷÈÏÄÄЩÏûÏ¢¡£

Èý. ACKģʽÓëÀàÐͽéÉÜ

JMS APIÖÐÔ¼¶¨ÁËClient¶Ë¿ÉÒÔʹÓÃËÄÖÖACKģʽ,ÔÚjavax.jms.Session½Ó¿ÚÖÐ:

1.AUTO_ACKNOWLEDGE = 1 ×Ô¶¯È·ÈÏ

2.CLIENT_ACKNOWLEDGE = 2 ¿Í»§¶ËÊÖ¶¯È·ÈÏ

3.DUPS_OK_ACKNOWLEDGE = 3 ×Ô¶¯ÅúÁ¿È·ÈÏ

4.SESSION_TRANSACTED = 0 ÊÂÎñÌá½»²¢È·ÈÏ

´ËÍâAcitveMQ²¹³äÁËÒ»¸ö×Ô¶¨ÒåµÄACKģʽ:

INDIVIDUAL_ACKNOWLEDGE = 4 µ¥ÌõÏûϢȷÈÏ

ÎÒÃÇÔÚ¿ª·¢JMSÓ¦ÓóÌÐòµÄʱºò,»á¾­³£Ê¹Óõ½ÉÏÊöACKģʽ,ÆäÖÐ"INDIVIDUAL_ACKNOWLEDGE "Ö»ÓÐActiveMQÖ§³Ö,µ±È»¿ª·¢ÕßÒ²¿ÉÒÔʹÓÃËü. ACKģʽÃèÊöÁËConsumerÓëbrokerÈ·ÈÏÏûÏ¢µÄ·½Ê½(ʱ»ú),±ÈÈçµ±ÏûÏ¢±»Consumer½ÓÊÕÖ®ºó,Consumer½«ÔÚºÎʱȷÈÏÏûÏ¢¡£¶ÔÓÚbroker¶øÑÔ£¬Ö»ÓнÓÊÕµ½ACKÖ¸Áî,²Å»áÈÏΪÏûÏ¢±»ÕýÈ·µÄ½ÓÊÕ»òÕß´¦Àí³É¹¦ÁË,ͨ¹ýACK£¬¿ÉÒÔÔÚconsumer£¨/producer£©ÓëBrokerÖ®¼ä½¨Á¢Ò»ÖÖ¼òµ¥µÄ¡°µ£±£¡±»úÖÆ.

Client¶ËÖ¸¶¨ÁËACKģʽ,µ«ÊÇÔÚClientÓëbrokerÔÚ½»»»ACKÖ¸ÁîµÄʱºò,»¹ÐèÒª¸æÖªACK_TYPE,ACK_TYPE±íʾ´ËÈ·ÈÏÖ¸ÁîµÄÀàÐÍ£¬²»Í¬µÄACK_TYPE½«´«µÝ×ÅÏûÏ¢µÄ״̬£¬broker¿ÉÒÔ¸ù¾Ý²»Í¬µÄACK_TYPE¶ÔÏûÏ¢½øÐв»Í¬µÄ²Ù×÷¡£

±ÈÈçConsumerÏû·ÑÏûϢʱ³öÏÖÒì³£,¾ÍÐèÒªÏòbroker·¢ËÍACKÖ¸Áî,ACK_TYPEΪ"REDELIVERED_ACK_TYPE",ÄÇôbroker¾Í»áÖØÐ·¢ËÍ´ËÏûÏ¢¡£ÔÚJMS APIÖв¢Ã»Óж¨ÒåACT_TYPE,ÒòΪËüͨ³£ÊÇÒ»ÖÖÄÚ²¿»úÖÆ,²¢²»»áÃæÏò¿ª·¢Õß¡£ActiveMQÖж¨ÒåÁËÈçϼ¸ÖÖACK_TYPE(²Î¿´MessageAckÀà):

1.DELIVERED_ACK_TYPE = 0 ÏûÏ¢"ÒѽÓÊÕ"£¬µ«ÉÐδ´¦Àí½áÊø

2.STANDARD_ACK_TYPE = 2 "±ê×¼"ÀàÐÍ,ͨ³£±íʾΪÏûÏ¢"´¦Àí³É¹¦"£¬broker¶Ë¿ÉÒÔɾ³ýÏûÏ¢ÁË

3.POSION_ACK_TYPE = 1 ÏûÏ¢"´íÎó",ͨ³£±íʾ"Åׯú"´ËÏûÏ¢£¬±ÈÈçÏûÏ¢ÖØ·¢¶à´Îºó£¬¶¼ÎÞ·¨ÕýÈ·´¦Àíʱ£¬ÏûÏ¢½«»á±»É¾³ý»òÕßDLQ(ËÀÐŶÓÁÐ)

4.REDELIVERED_ACK_TYPE = 3 ÏûÏ¢Ðè"ÖØ·¢"£¬±ÈÈçconsumer´¦ÀíÏûϢʱÅ׳öÁËÒì³££¬brokerÉÔºó»áÖØÐ·¢ËÍ´ËÏûÏ¢

5.INDIVIDUAL_ACK_TYPE = 4 ±íʾֻȷÈÏ"µ¥ÌõÏûÏ¢",ÎÞÂÛÔÚÈκÎACK_MODEÏÂ

6.UNMATCHED_ACK_TYPE = 5 ÔÚTopicÖУ¬Èç¹ûÒ»ÌõÏûÏ¢ÔÚת·¢¸ø¡°¶©ÔÄÕß¡±Ê±£¬·¢ÏÖ´ËÏûÏ¢²»·ûºÏSelector¹ýÂËÌõ¼þ£¬ÄÇô´ËÏûÏ¢½« ²»»áת·¢¸ø¶©ÔÄÕߣ¬ÏûÏ¢½«»á±»´æ´¢ÒýÇæÉ¾³ý(Ï൱ÓÚÔÚBrokerÉÏÈ·ÈÏÁËÏûÏ¢)¡£

µ½Ä¿Ç°ÎªÖ¹,ÎÒÃÇÒѾ­Çå³þÁË´ó¸ÅµÄÔ­Àí: Client¶ËÔÚ²»Í¬µÄACKģʽʱ,½«Òâζ×ÅÔÚ²»Í¬µÄʱ»ú·¢ËÍACKÖ¸Áî,ÿ¸öACK CommandÖлá°üº¬ACK_TYPE,ÄÇôbroker¶Ë¾Í¿ÉÒÔ¸ù¾ÝACK_TYPEÀ´¾ö¶¨´ËÏûÏ¢µÄºóÐø²Ù×÷. ½ÓÏÂÀ´,ÎÒÃÇÏêϸµÄ·ÖÎöACKģʽÓëACK_TYPE.

Session session
= connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

ÎÒÃÇÐèÒªÔÚ´´½¨Sessionʱָ¶¨ACKģʽ,Óɴ˿ɼû,ACKģʽ½«ÊÇsession¹²ÏíµÄ,Òâζ×ÅÒ»¸ösessionÏÂËùÓÐµÄ consumer¶¼Ê¹ÓÃͬһÖÖACKģʽ¡£ÔÚ´´½¨Sessionʱ,¿ª·¢Õß²»ÄÜÖ¸¶¨³ýACKģʽÁбíÖ®ÍâµÄÆäËûÖµ.Èç¹û´ËsessionΪÊÂÎñÀàÐÍ,Óû§Ö¸¶¨µÄACKģʽ½«±»ºöÂÔ,¶øÇ¿ÖÆÊ¹ÓÃ"SESSION_TRANSACTED"ÀàÐÍ;Èç¹ûsession·ÇÊÂÎñÀàÐÍʱ,Ò²½«²»Äܽ« ACKģʽÉ趨Ϊ"SESSION_TRANSACTED",±Ï¾¹ÕâÊÇÏà㣵Ä.

ConsumerÏû·ÑÏûÏ¢µÄ·ç¸ñÓÐ2ÖÖ: ͬ²½/Òì²½..ʹÓÃconsumer.receive()¾ÍÊÇͬ²½£¬Ê¹ÓÃmessageListener¾ÍÊÇÒì²½£»ÔÚͬһ¸öconsumerÖУ¬ÎÒÃDz»ÄÜͬʱʹÓÃÕâ2ÖÖ·ç¸ñ£¬±ÈÈçÔÚʹÓÃlistenerµÄÇé¿öÏ£¬µ±µ÷ÓÃreceive()·½·¨½«»á»ñµÃÒ»¸öException¡£Á½ÖÖ·ç¸ñÏ£¬ÏûϢȷÈÏʱ»úÓÐËù²»Í¬¡£

"ͬ²½"α´úÂ룺

//receiveα´úÂë---¹ý³Ì
Message message = sessionMessageQueue.dequeue();
if(message != null){
ack(message);
}
return message

ͬ²½µ÷ÓÃʱ£¬ÔÚÏûÏ¢´Óreceive·½·¨·µ»ØÖ®Ç°£¬¾ÍÒѾ­µ÷ÓÃÁËACK£»Òò´ËÈç¹ûClient¶ËûÓд¦Àí³É¹¦£¬´ËÏûÏ¢½«¶ªÊ§(¿ÉÄÜÖØ·¢£¬ÓëACKģʽÓйØ)¡£

"Òì²½"α´úÂ룺

//»ùÓÚlistener
Session session = connection.getSession(consumerId);
sessionQueueBuffer.enqueue(message);
Runnable runnable = new Ruannale(){
run(){
Consumer consumer = session.getConsumer(consumerId);
Message md = sessionQueueBuffer.dequeue();
try{
consumer.messageListener.onMessage(md);
ack(md);//
}catch(Exception e){
redelivery();//sometime£¬not all the time;
}
}
//sessionÖн«²ÉÈ¡Ï̳߳صķ½Ê½£¬·Ö·¢Òì²½ÏûÏ¢
//Òò´Ëͬһ¸ösessionÖжà¸öconsumer¿ÉÒÔ²¢ÐÐÏû·Ñ
threadPool.execute(runnable);

»ùÓÚÒì²½µ÷ÓÃʱ£¬ÏûÏ¢µÄÈ·ÈÏÊÇÔÚonMessage·½·¨·µ»ØÖ®ºó£¬Èç¹ûonMessage·½·¨Òì³££¬»áµ¼ÖÂÏûÏ¢²»Äܱ»ACK£¬»á´¥·¢ÖØ·¢¡£

ËÄ. ACKģʽÏê½â

AUTO_ACKNOWLEDGE : ×Ô¶¯È·ÈÏ,Õâ¾ÍÒâζ×ÅÏûÏ¢µÄÈ·ÈÏʱ»ú½«ÓÐconsumerÔñ»úÈ·ÈÏ."Ôñ»úÈ·ÈÏ"ËÆºõ³äÂúÁ˲»È·¶¨ÐÔ,ÕâÒ²Òâζ×Å,¿ª·¢Õß±ØÐëÃ÷È·ÖªµÀ"Ôñ»úÈ·ÈÏ"µÄ¾ßÌåʱ»ú,·ñÔò½«ÓпÉÄܵ¼ÖÂÏûÏ¢µÄ¶ªÊ§,»òÕßÏûÏ¢µÄÖØ¸´½ÓÊÕ.ÄÇôÔÚActiveMQÖÐ,AUTO_ACKNOWLEDGEÊÇÈçºÎÔË×÷µÄÄØ?

1) ¶ÔÓÚconsumer¶øÑÔ£¬optimizeAcknowledgeÊôÐÔÖ»»áÔÚAUTO_ACKģʽÏÂÓÐЧ¡£

2) ÆäÖÐDUPS_ACKNOWLEGEÒ²ÊÇÒ»ÖÖDZÔÚµÄAUTO_ACK,Ö»ÊÇÈ·ÈÏÏûÏ¢µÄÌõÊýºÍʱ¼äÉÏÓÐËù²»Í¬¡£

3) ÔÚ¡°Í¬²½¡±(receive)·½·¨·µ»Ømessage֮ǰ,»á¼ì²âoptimizeACKÑ¡ÏîÊÇ·ñ¿ªÆô£¬Èç¹ûûÓпªÆô£¬´Ëµ¥ÌõÏûÏ¢½«Á¢¼´È·ÈÏ£¬ËùÒÔÔÚÕâÖÖÇé¿öÏ£¬message·µ»ØÖ®ºó£¬Èç¹û¿ª·¢ÕßÔÚ´¦Àímessage¹ý³ÌÖгöÏÖÒì³££¬»áµ¼Ö´ËÏûÏ¢Ò²²»»áredelivery,¼´"DZÔÚµÄÏûÏ¢¶ªÊ§"£»Èç¹û¿ªÆôÁËoptimizeACK£¬Ôò»áÔÚunAckÊýÁ¿´ïµ½prefetch * 0.65ʱȷÈÏ£¬µ±È»ÎÒÃÇ¿ÉÒÔÖ¸¶¨prefetchSize = 1À´ÊµÏÖÖðÌõÏûϢȷÈÏ¡£

4) ÔÚ"Òì²½"(messageListener)·½Ê½ÖÐ,½«»áÊ×Ïȵ÷ÓÃlistener.onMessage(message),´ËºóÔÙACK,Èç¹ûonMessage·½·¨Òì³£,½«µ¼ÖÂclient¶Ë²¹³ä·¢ËÍÒ»¸öACK_TYPEΪREDELIVERED_ACK_TYPEÈ·ÈÏÖ¸ÁÈç¹ûonMessage·½·¨Õý³£,ÏûÏ¢½«»áÕý³£È·ÈÏ(STANDARD_ACK_TYPE)¡£´ËÍâÐèҪעÒ⣬ÏûÏ¢µÄÖØ·¢´ÎÊýÊÇÓÐÏÞÖÆµÄ£¬Ã¿ÌõÏûÏ¢Öж¼»á°üº¬¡°redeliveryCounter¡±¼ÆÊýÆ÷£¬ÓÃÀ´±íʾ´ËÏûÏ¢ÒѾ­±»ÖØ·¢µÄ´ÎÊý£¬Èç¹ûÖØ·¢´ÎÊý´ïµ½·§Öµ£¬½«»áµ¼Ö·¢ËÍÒ»¸öACK_TYPEΪPOSION_ACK_TYPEÈ·ÈÏÖ¸Áî,Õâ¾Íµ¼ÖÂbroker¶ËÈÏΪ´ËÏûÏ¢ÎÞ·¨Ïû·Ñ,´ËÏûÏ¢½«»á±»É¾³ý»òÕßÇ¨ÒÆµ½"dead letter"ͨµÀÖС£

Òò´Ëµ±ÎÒÃÇʹÓÃmessageListener·½Ê½Ïû·ÑÏûϢʱ£¬Í¨³£½¨ÒéÔÚonMessage·½·¨ÖÐʹÓÃtry-catch,ÕâÑù¿ÉÒÔÔÚ´¦ÀíÏûÏ¢³ö´íʱ¼Ç¼һЩÐÅÏ¢£¬¶ø²»ÊÇÈÃconsumer²»¶ÏÈ¥ÖØ·¢ÏûÏ¢£»Èç¹ûÄãûÓÐʹÓÃtry-catch,¾ÍÓпÉÄÜ»áÒòΪÒì³£¶øµ¼ÖÂÏûÏ¢ÖØ¸´½ÓÊÕµÄÎÊÌâ,ÐèҪעÒâÄãµÄonMessage·½·¨ÖÐÂß¼­ÊÇ·ñÄܹ»¼æÈݶÔÖØ¸´ÏûÏ¢µÄÅжϡ£

CLIENT_ACKNOWLEDGE : ¿Í»§¶ËÊÖ¶¯È·ÈÏ£¬Õâ¾ÍÒâζ×ÅAcitveMQ½«²»»á¡°×Ô×÷Ö÷ÕÅ¡±µÄΪÄãACKÈκÎÏûÏ¢£¬¿ª·¢ÕßÐèÒª×Ô¼ºÔñ»úÈ·ÈÏ¡£ÔÚ´ËģʽÏ£¬¿ª·¢ÕßÐèÒªÐèÒª¹Ø×¢¼¸¸ö·½·¨£º1) message.acknowledge()£¬2) ActiveMQMessageConsumer.acknowledege()£¬3) ActiveMQSession.acknowledge()£»Æä1)ºÍ3)ÊǵÈЧµÄ£¬½«µ±Ç°sessionÖÐËùÓÐconsumerÖÐÉÐδACKµÄÏûÏ¢¶¼Ò»ÆðÈ·ÈÏ£¬2)Ö»»á¶Ôµ±Ç°consumerÖÐÄÇЩÉÐδȷÈϵÄÏûÏ¢½øÐÐÈ·ÈÏ¡£¿ª·¢Õß¿ÉÒÔÔÚºÏÊʵÄʱ»ú±ØÐëµ÷ÓÃÒ»´ÎÉÏÊö·½·¨¡£ÎªÁ˱ÜÃâ»ìÂÒ£¬¶ÔÓÚÕâÖÖACKģʽÏ£¬½¨ÒéÒ»¸ösessionÏÂÖ»ÓÐÒ»¸öconsumer¡£

ÎÒÃÇͨ³£»áÔÚ»ùÓÚGroup(ÏûÏ¢·Ö×é)Çé¿öÏ»áʹÓÃCLIENT_ACKNOWLEDGE£¬ÎÒÃǽ«ÔÚÒ»¸ögroupµÄÏûÏ¢ÐòÁнÓÊÜÍê±ÏÖ®ºóÈ·ÈÏÏûÏ¢(×é)£»²»¹ýµ±ÄãÈÏΪÏûÏ¢ºÜÖØÒª£¬Ö»Óе±ÏûÏ¢±»ÕýÈ·´¦ÀíÖ®ºó²ÅÄÜÈ·ÈÏʱ£¬Ò²¿ÉÒÔʹÓôËģʽ ¡£

Èç¹û¿ª·¢ÕßÍü¼Çµ÷ÓÃacknowledge·½·¨£¬½«»áµ¼Öµ±consumerÖØÆôºó£¬»á½ÓÊܵ½Öظ´ÏûÏ¢£¬ÒòΪ¶ÔÓÚbroker¶øÑÔ£¬ÄÇЩÉÐÎ´ÕæÕýACKµÄÏûÏ¢±»ÊÓΪ¡°Î´Ïû·Ñ¡±¡£

¿ª·¢Õß¿ÉÒÔÔÚµ±Ç°ÏûÏ¢´¦Àí³É¹¦Ö®ºó£¬Á¢¼´µ÷ÓÃmessage.acknowledge()·½·¨À´"Öð¸ö"È·ÈÏÏûÏ¢£¬ÕâÑù¿ÉÒÔ¾¡¿ÉÄܵļõÉÙÒòÍøÂç¹ÊÕ϶øµ¼ÖÂÏûÏ¢ÖØ·¢µÄ¸öÊý£»µ±È»Ò²¿ÉÒÔ´¦Àí¶àÌõÏûÏ¢Ö®ºó£¬¼äЪÐԵĵ÷ÓÃacknowledge·½·¨À´Ò»´ÎÈ·È϶àÌõÏûÏ¢£¬¼õÉÙackµÄ´ÎÊýÀ´ÌáÉýconsumerµÄЧÂÊ£¬²»¹ýÕâÈÔÈ»ÊÇÒ»¸öÀû±×ȨºâµÄÎÊÌâ¡£

³ýÁËmessage.acknowledge()·½·¨Ö®Í⣬ActiveMQMessageConumser.acknowledge()ºÍActiveMQSession.acknowledge()Ò²¿ÉÒÔÈ·ÈÏÏûÏ¢£¬Ö»²»¹ýǰÕßÖ»»áÈ·Èϵ±Ç°consumerÖеÄÏûÏ¢¡£ÆäÖÐsesson.acknowledge()ºÍmessage.acknowledge()ÊǵÈЧµÄ¡£

ÎÞÂÛÊÇ¡°Í¬²½¡±/¡°Òì²½¡±£¬ActiveMQ¶¼²»»á·¢ËÍSTANDARD_ACK_TYPE£¬Ö±µ½message.acknowledge()µ÷Óá£Èç¹ûÔÚclient¶ËδȷÈϵÄÏûÏ¢¸öÊý´ïµ½prefetchSize * 0.5ʱ£¬»á²¹³ä·¢ËÍÒ»¸öACK_TYPEΪDELIVERED_ACK_TYPEµÄÈ·ÈÏÖ¸ÁÕâ»á´¥·¢broker¶Ë¿ÉÒÔ¼ÌÐøpushÏûÏ¢µ½client¶Ë¡£(²Î¿´PrefetchSubscription.acknwoledge·½·¨)

ÔÚbroker¶Ë£¬Õë¶Ôÿ¸öConsumer£¬¶¼»á±£´æÒ»¸öÒòΪ"DELIVERED_ACK_TYPE"¶ø¡°ÍÏÑÓ¡±µÄÏûÏ¢¸öÊý£¬Õâ¸ö²ÎÊýΪprefetchExtension£¬ÊÂʵÉÏÕâ¸öÖµ²»»á´óÓÚprefetchSize * 0.5,ÒòΪConsumer¶Ë»áÑϸñ¿ØÖÆDELIVERED_ACK_TYPEÖ¸Áî·¢Ë͵Äʱ»ú(²Î¼ûActiveMQMessageConsumer.ackLater·½·¨)£¬broker¶Ëͨ¹ý¡°prefetchExtension¡±ÓëprefetchSize»¥ÏàÅäºÏ£¬À´¾ö¶¨¼´½«push¸øclient¶ËµÄÏûÏ¢¸öÊý£¬count = prefetchExtension + prefetchSize - dispatched.size()£¬ÆäÖÐdispatched±íʾÒѾ­·¢Ë͸øclient¶Ëµ«ÊÇ»¹Ã»ÓС°STANDARD_ACK_TYPE¡±µÄÏûÏ¢×ÜÁ¿£»Óɴ˿ɼû£¬ÔÚCLIENT_ACKģʽÏ£¬×ã¹»¿ìËٵĵ÷ÓÃacknowledge()·½·¨ÊǾö¶¨consumer¶ËÏû·ÑÏûÏ¢µÄËÙÂÊ£»Èç¹ûclient¶ËÒòΪijÖÖÔ­Òòµ¼ÖÂacknowledge·½·¨Î´±»Ö´ÐУ¬½«µ¼Ö´óÁ¿ÏûÏ¢²»Äܱ»È·ÈÏ£¬broker¶Ë½«²»»ápushÏûÏ¢£¬ÊÂʵÉÏclient¶Ë½«´¦ÓÚ¡°¼ÙËÀ¡±×´Ì¬£¬¶øÎÞ·¨¼ÌÐøÏû·ÑÏûÏ¢¡£ÎÒÃÇÒªÇóclient¶ËÔÚÏû·Ñ1.5*prefetchSize¸öÏûϢ֮ǰ£¬±ØÐëacknowledge()Ò»´Î£»Í¨³£ÎÒÃÇ×ÜÊÇÿÏû·ÑÒ»¸öÏûÏ¢µ÷ÓÃÒ»´Î£¬ÕâÊÇÒ»ÖÖÁ¼ºÃµÄÉè¼Æ¡£

´ËÍâÐèÒª¶îÍâµÄ²¹³äһϣºËùÓÐACKÖ¸Áî¶¼ÊÇÒÀ´Î·¢Ë͸øbroker¶Ë£¬ÔÚCLIET_ACKģʽÏ£¬ÏûÏ¢ÔÚ½»¸¶¸ølistener֮ǰ£¬¶¼»áÊ×ÏÈ´´½¨Ò»¸öDELIVERED_ACK_TYPEµÄACKÖ¸Áֱµ½client¶ËδȷÈϵÄÏûÏ¢´ïµ½"prefetchSize * 0.5"ʱ²Å»á·¢ËÍ´ËACKÖ¸ÁÈç¹ûÔÚ´Ë֮ǰ£¬¿ª·¢Õßµ÷ÓÃÁËacknowledge()·½·¨£¬»áµ¼ÖÂÏûÏ¢Ö±½Ó±»È·ÈÏ(STANDARD_ACK_TYPE)¡£broker¶Ëͨ³£»áÈÏΪ¡°DELIVERED_ACK_TYPE¡±È·ÈÏÖ¸ÁîÊÇÒ»ÖÖ¡°slow consumer¡±Ðźţ¬Èç¹ûconsumer²»Äܼ°Ê±µÄ¶ÔÏûÏ¢½øÐÐacknowledge¶øµ¼ÖÂbroker¶Ë×èÈû£¬ÄÇô´Ëconsumer½«»á±»±ê¼ÇΪ¡°slow¡±£¬´ËºóqueueÖеÄÏûÏ¢½«»áת·¢¸øÆäËûConsumer¡£

DUPS_OK_ACKNOWLEDGE : "ÏûÏ¢¿ÉÖØ¸´"È·ÈÏ£¬Òâ˼ÊÇ´ËģʽÏ£¬¿ÉÄÜ»á³öÏÖÖØ¸´ÏûÏ¢£¬²¢²»ÊÇÒ»ÌõÏûÏ¢ÐèÒª·¢ËͶà´ÎACK²ÅÐС£ËüÊÇÒ»ÖÖDZÔÚµÄ"AUTO_ACK"È·ÈÏ»úÖÆ£¬ÎªÅúÁ¿È·È϶øÉú£¬¶øÇÒ¾ßÓС°ÑÓ³Ù¡±È·ÈϵÄÌØµã¡£¶ÔÓÚ¿ª·¢Õß¶øÑÔ£¬ÕâÖÖģʽϵĴúÂë½á¹¹ºÍAUTO_ACKNOWLEDGEÒ»Ñù£¬²»ÐèÒªÏñCLIENT_ACKNOWLEDGEÄÇÑùµ÷ÓÃacknowledge()·½·¨À´È·ÈÏÏûÏ¢¡£

1) ÔÚActiveMQÖУ¬Èç¹ûÔÚDestinationÊÇQueueͨµÀ£¬ÎÒÃÇÕæµÄ¿ÉÒÔÈÏΪDUPS_OK_ACK¾ÍÊÇ¡°AUTO_ACK + optimizeACK + (prefetch > 0)¡±ÕâÖÖÇé¿ö£¬ÔÚÈ·ÈÏʱ»úÉϼ¸ºõÍêȫһÖ£»´ËÍâÔÚ´ËģʽÏ£¬Èç¹ûprefetchSize =1 »òÕßûÓпªÆôoptimizeACK£¬Ò²»áµ¼ÖÂÏûÏ¢ÖðÌõÈ·ÈÏ£¬´Ó¶øÊ§È¥ÅúÁ¿È·ÈϵÄÌØÐÔ¡£

2) Èç¹ûDestinationΪTopic£¬DUPS_OK_ACKNOWLEDGE²Å»á²úÉúJMS¹æ·¶ÖÐÚ¹Ê͵ÄÒâÒ壬¼´ÎÞÂÛoptimizeACKÊÇ·ñ¿ªÆô£¬¶¼»áÔÚÏû·ÑµÄÏûÏ¢¸öÊý>=prefetch * 0.5ʱ£¬ÅúÁ¿È·ÈÏ(STANDARD_ACK_TYPE),Ôڴ˹ý³ÌÖУ¬²»»á·¢ËÍDELIVERED_ACK_TYPEµÄÈ·ÈÏÖ¸Áî,ÕâÊÇ1)ºÍAUTO_ACKµÄ×î´óµÄÇø±ð¡£

ÕâÒ²Òâζ×Å£¬µ±consumer¹ÊÕÏÖØÆôºó£¬ÄÇЩÉÐδACKµÄÏûÏ¢»áÖØÐ·¢Ë͹ýÀ´¡£

SESSION_TRANSACTED : µ±sessionʹÓÃÊÂÎñʱ£¬¾ÍÊÇʹÓôËģʽ¡£ÔÚÊÂÎñ¿ªÆôÖ®ºó£¬ºÍsession.commit()֮ǰ£¬ËùÓÐÏû·ÑµÄÏûÏ¢£¬ÒªÃ´È«²¿Õý³£È·ÈÏ£¬ÒªÃ´È«²¿redelivery¡£ÕâÖÖÑϽ÷ÐÔ£¬Í¨³£ÔÚ»ùÓÚGROUP(ÏûÏ¢·Ö×é)»òÕ߯äËû³¡¾°ÏÂÌØ±ðÊʺϡ£ÔÚSESSION_TRANSACTEDģʽÏ£¬optimizeACK²¢²»ÄÜ·¢»ÓÈκÎЧ¹û,ÒòΪÔÚ´ËģʽÏ£¬optimizeACK»á±»Ç¿ÖÆÉ趨Ϊfalse£¬²»¹ýprefetchÈÔÈ»¿ÉÒÔ¾ö¶¨DELIVERED_ACK_TYPEµÄ·¢ËÍʱ»ú¡£

ÒòΪSession·ÇḬ̈߳²È«£¬ÄÇôµ±Ç°sessionÏÂËùÓеÄconsumer¶¼»á¹²Ïíͬһ¸ötransactionContext£»Í¬Ê±½¨Ò飬һ¸öÊÂÎñÀàÐ͵ÄSessionÖÐÖ»ÓÐÒ»¸öConsumer£¬ÒÔ±ÜÃârollback()»òÕßcommit()·½·¨±»¶à¸öconsumerµ÷ÓöøÔì³ÉµÄÏûÏ¢»ìÂÒ¡£

µ±consumer½ÓÊܵ½ÏûÏ¢Ö®ºó£¬Ê×Ïȼì²âTransactionContextÊÇ·ñÒѾ­¿ªÆô£¬Èç¹ûûÓУ¬¾Í»á¿ªÆô²¢Éú³ÉеÄtransactionId£¬²¢°ÑÐÅÏ¢·¢Ë͸øbroker£»´Ëºó½«¼ì²âÊÂÎñÖÐÒѾ­Ïû·ÑµÄÏûÏ¢¸öÊýÊÇ·ñ >= prefetch * 0.5,Èç¹û´óÓÚÔò²¹³ä·¢ËÍÒ»¸ö¡°DELIVERED_ACK_TYPE¡±µÄÈ·ÈÏÖ¸ÁÕâʱ¾Í¿ªÊ¼µ÷ÓÃonMessage()·½·¨£¬Èç¹ûÊÇͬ²½(receive),ÄÇô¼´·µ»Ømessage¡£ÉÏÊö¹ý³Ì£¬ºÍÆäËûÈ·ÈÏģʽûÓÐÈκÎÌØÊâµÄµØ·½¡£

µ±¿ª·¢Õß¾ö¶¨ÊÂÎñ¿ÉÒÔÌύʱ£¬±ØÐëµ÷ÓÃsession.commit()·½·¨£¬commit·½·¨½«»áµ¼Öµ±Ç°sessionµÄÊÂÎñÖÐËùÓÐÏûÏ¢Á¢¼´±»È·ÈÏ£»ÊÂÎñµÄÈ·ÈϹý³ÌÖУ¬Ê×ÏȰѱ¾µØµÄdeliveredMessage¶ÓÁÐÖÐÉÐδȷÈϵÄÏûϢȫ²¿È·ÈÏ(STANDARD_ACK_TYPE)£»´ËºóÏòbroker·¢ËÍtransactionÌá½»Ö¸Áî²¢µÈ´ýbroker·´À¡£¬Èç¹ûbroker¶ËÊÂÎñ²Ù×÷³É¹¦£¬ÄÇô½«»á°Ñ±¾µØdeliveredMessage¶ÓÁÐÇå¿Õ£¬ÐµÄÊÂÎñ¿ªÊ¼£»Èç¹ûbroker¶ËÊÂÎñ²Ù×÷ʧ°Ü(´ËʱbrokerÒѾ­rollback)£¬ÄÇô¶ÔÓÚsession¶øÑÔ£¬½«Ö´ÐÐinner-rollback£¬Õâ¸örollbackËù×öµÄÊÂÇ飬¾ÍÊǽ«µ±Ç°ÊÂÎñÖеÄÏûÏ¢Çå¿Õ²¢ÒªÇóbrokerÖØ·¢(REDELIVERED_ACK_TYPE),ͬʱcommit·½·¨½«Å׳öÒì³£¡£

µ±session.commit·½·¨Ò쳣ʱ£¬¶ÔÓÚ¿ª·¢Õß¶øÑÔͨ³£Êǵ÷ÓÃsession.rollback()»Ø¹öÊÂÎñ(ÊÂʵÉÏ¿ª·¢Õß²»µ÷ÓÃҲûÓÐÎÊÌâ)£¬µ±È»Äã¿ÉÒÔÔÚÊÂÎñ¿ªÊ¼Ö®ºóµÄÈκÎʱ»úµ÷ÓÃrollback(),rollbackÒâζ×ŵ±Ç°ÊÂÎñµÄ½áÊø£¬ÊÂÎñÖÐËùÓеÄÏûÏ¢¶¼½«±»ÖØ·¢¡£ÐèҪעÒ⣬ÎÞÂÛÊÇinner-rollback»¹Êǵ÷ÓÃsession.rollback()¶øµ¼ÖÂÏûÏ¢ÖØ·¢£¬¶¼»áµ¼ÖÂmessage.redeliveryCounter¼ÆÊýÆ÷Ôö¼Ó£¬×îÖÕ¶¼»áÊÜÏÞÓÚbrokerUrlÖÐÅäÖõÄ"jms.redeliveryPolicy.maximumRedeliveries",Èç¹ûrollbackµÄ´ÎÊý¹ý¶à£¬¶ø´ïµ½ÖØ·¢´ÎÊýµÄÉÏÏÞʱ£¬ÏûÏ¢½«»á±»DLQ(dead letter)¡£

INDIVIDUAL_ACKNOWLEDGE : µ¥ÌõÏûϢȷÈÏ£¬ÕâÖÖÈ·ÈÏģʽ£¬ÎÒÃǺÜÉÙʹÓã¬ËüµÄÈ·ÈÏʱ»úºÍCLIENT_ACKNOWLEDGE¼¸ºõÒ»Ñù£¬µ±ÏûÏ¢Ïû·Ñ³É¹¦Ö®ºó£¬ÐèÒªµ÷ÓÃmessage.acknowledegeÀ´È·ÈÏ´ËÏûÏ¢(µ¥Ìõ)£¬¶øCLIENT_ACKNOWLEDGEģʽÏÈmessage.acknowledge()·½·¨½«µ¼ÖÂÕû¸ösessionÖÐËùÓÐÏûÏ¢±»È·ÈÏ(ÅúÁ¿È·ÈÏ)¡£

½áÓµ½Ä¿Ç°ÎªÖ¹£¬ÎÒÃÇÒѾ­ÒѾ­¼òµ¥µÄÁ˽âÁËActiveMQÖÐÏûÏ¢´«ËÍ»úÖÆ£¬»¹ÓÐJMSÖÐACK²ßÂÔ£¬Öصã·ÖÎöÁËoptimizeACKµÄ²ßÂÔ£¬Ï£Íû¿ª·¢ÕßÄܹ»ÔÚʹÓÃactiveMQÖбÜÃâһЩ²»±ØÒªµÄ´íÎó.

   
2986 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

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

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

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
¼Ü¹¹Éè¼Æ-̸̸¼Ü¹¹
ʵÏÖSaaS£¨Èí¼þ¼°·þÎñ£©¼Ü¹¹Èý´ó¼¼ÊõÌôÕ½
µ½µ×ʲôÊÇÊý¾ÝÖÐ̨£¿
ÏìӦʽ¼Ü¹¹¼ò½é
ÒµÎñ¼Ü¹¹¡¢Ó¦Óüܹ¹ÓëÔÆ»ù´¡¼Ü¹¹
×îпγÌ
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
´Ó´óÐ͵çÉ̼ܹ¹Ñݽø¿´»¥ÁªÍø¸ß¿ÉÓüܹ¹Éè¼Æ
´óÐÍ»¥ÁªÍø¸ß¿ÉÓüܹ¹Éè¼ÆÊµ¼ù
ÆóÒµ¼Ü¹¹Ê¦ (TOGAF¹Ù·½ÈÏÖ¤)
ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ¡ª¸ß¼¶Êµ¼ù
³É¹¦°¸Àý
ijÐÂÄÜÔ´µçÁ¦ÆóÒµ Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
Öк½¹¤ÒµÄ³Ñо¿Ëù ǶÈëʽÈí¼þ¿ª·¢Ö¸ÄÏ
ij¹ìµÀ½»Í¨ÐÐÒµ ǶÈëʽÈí¼þ¸ß¼¶Éè¼ÆÊµ¼ù
±±¾© º½Ìì¿Æ¹¤Ä³×Ó¹«Ë¾ Èí¼þ²âÊԼܹ¹Ê¦
±±¾©Ä³ÁìÏÈÊý×ÖµØÍ¼ ¼Ü¹¹Ê¦£¨Éè¼Æ°¸Àý£©