¡¾Ç°ÑÔ¡¿
Ëæ×Å»¥ÁªÍøÐÅÏ¢¼¼ÊõµÄ·ÉËÙ·¢Õ¹£¬Êý¾ÝÁ¿²»¶ÏÔö´ó£¬ÒµÎñÂß¼Ò²ÈÕÇ÷¸´ÔÓ£¬¶ÔϵͳµÄ¸ß²¢·¢·ÃÎÊ¡¢º£Á¿Êý¾Ý´¦ÀíµÄ³¡¾°Ò²Ô½À´Ô½¶à¡£ÈçºÎÓýϵͳɱ¾ÊµÏÖϵͳµÄ¸ß¿ÉÓá¢Ò×ÉìËõ¡¢¿ÉÀ©Õ¹µÈÄ¿±ê¾ÍÏÔµÃÔ½·¢ÖØÒª¡£ÎªÁ˽â¾öÕâһϵÁÐÎÊÌ⣬ϵͳ¼Ü¹¹Ò²ÔÚ²»¶ÏÑݽø¡£´«Í³µÄ¼¯ÖÐʽϵͳÒѾÖð½¥ÎÞ·¨Âú×ãÒªÇ󣬷ֲ¼Ê½ÏµÍ³±»Ê¹ÓÃÔÚ¸ü¶àµÄ³¡¾°ÖС£
·Ö²¼Ê½ÏµÍ³ÓɶÀÁ¢µÄ·þÎñÆ÷ͨ¹ýÍøÂçËÉÉ¢ñîºÏ×é³É¡£ÔÚÕâ¸öϵͳÖÐÿ¸ö·þÎñÆ÷¶¼ÊÇһ̨¶ÀÁ¢µÄÖ÷»ú£¬·þÎñÆ÷Ö®¼äͨ¹ýÄÚ²¿ÍøÂçÁ¬½Ó¡£·Ö²¼Ê½ÏµÍ³ÓÐÒÔϼ¸¸öÌØµã£º
¿ÉÀ©Õ¹ÐÔ£º¿Éͨ¹ýºáÏòˮƽÀ©Õ¹Ìá¸ßϵͳµÄÐÔÄܺÍÍÌÍÂÁ¿¡£
¸ß¿É¿¿ÐÔ£º¸ßÈÝ´í£¬¼´Ê¹ÏµÍ³ÖÐһ̨»ò¼¸Ì¨¹ÊÕÏ£¬ÏµÍ³ÈÔ¿ÉÌṩ·þÎñ¡£
¸ß²¢·¢ÐÔ£º¸÷»úÆ÷²¢ÐжÀÁ¢´¦ÀíºÍ¼ÆËã¡£
Á®¼Û¸ßЧ£º¶ą̀СÐÍ»ú¶ø·Çµ¥Ì¨¸ßÐÔÄÜ»ú¡£
È»¶ø£¬ÔÚ·Ö²¼Ê½ÏµÍ³ÖУ¬Æä»·¾³µÄ¸´ÔÓ¶È¡¢ÍøÂçµÄ²»È·¶¨ÐÔ»áÔì³ÉÖîÈçʱÖÓ²»Ò»Ö¡¢¡°°Ýռͥ½«¾üÎÊÌ⡱£¨Byzantine
failure£©µÈ¡£´æÔÚÓÚ¼¯ÖÐʽϵͳÖеĻúÆ÷å´»ú¡¢ÏûÏ¢¶ªÊ§µÈÎÊÌâÒ²»áÔÚ·Ö²¼Ê½»·¾³ÖбäµÃ¸ü¼Ó¸´ÔÓ¡£
»ùÓÚ·Ö²¼Ê½ÏµÍ³µÄÕâÐ©ÌØÕ÷£¬ÓÐÁ½ÖÖÎÊÌâÖð½¥³ÉΪÁË·Ö²¼Ê½»·¾³ÖÐÐèÒªÖØµã¹Ø×¢ºÍ½â¾öµÄµäÐÍÎÊÌ⣺
»¥³âÐÔÎÊÌâ¡£
ÃݵÈÐÔÎÊÌâ¡£
½ñÌìÎÒÃǾÍÕë¶ÔÕâÁ½¸öÎÊÌâÀ´½øÐзÖÎö¡£
»¥³âÐÔÎÊÌâ
ÏÈ¿´Á½¸ö³£¼ûµÄÀý×Ó£º
Àý1£ºÄ³·þÎñ¼Ç¼¹Ø¼üÊý¾ÝX£¬µ±Ç°ÖµÎª100¡£AÇëÇóÐèÒª½«XÔö¼Ó200£»Í¬Ê±£¬BÇëÇóÐèÒª½«X¼õ100¡£
ÔÚÀíÏëµÄÇé¿öÏ£¬AÏȶÁÈ¡µ½X=100£¬È»ºóXÔö¼Ó200£¬×îºóдÈëX=300¡£BÇëÇó½Ó×Å´Ó¶ÁÈ¡X=300£¬¼õÉÙ100£¬×îºóдÈëX=200¡£
È»¶øÔÚÕæÊµÇé¿öÏ£¬Èç¹û²»×öÈκδ¦Àí£¬Ôò¿ÉÄÜ»á³öÏÖ£ºAºÍBͬʱ¶ÁÈ¡µ½X=100£»AдÈë֮ǰB¶ÁÈ¡µ½X£»B±ÈAÏÈдÈëµÈÇé¿ö¡£
Àý2£ºÄ³·þÎñÌṩһ×éÈÎÎñ£¬AÇëÇóËæ»ú´ÓÈÎÎñ×éÖлñȡһ¸öÈÎÎñ£»BÇëÇóËæ»ú´ÓÈÎÎñ×éÖлñȡһ¸öÈÎÎñ¡£
ÔÚÀíÏëµÄÇé¿öÏ£¬A´ÓÈÎÎñ×éÖÐÌôѡһ¸öÈÎÎñ£¬ÈÎÎñ×éɾ³ý¸ÃÈÎÎñ£¬B´ÓʣϵĵÄÈÎÎñÖÐÔÙÌôÒ»¸ö£¬ÈÎÎñ×éɾ³ý¸ÃÈÎÎñ¡£
ͬÑùµÄ£¬ÔÚÕæÊµÇé¿öÏ£¬Èç¹û²»×öÈκδ¦Àí£¬¿ÉÄÜ»á³öÏÖAºÍBÌôÖÐÁËͬһ¸öÈÎÎñµÄÇé¿ö¡£
ÒÔÉϵÄÁ½¸öÀý×Ó£¬¶¼´æÔÚ²Ù×÷»¥³âÐÔµÄÎÊÌâ¡£»¥³âÐÔÎÊÌâÓÃͨË׵ϰÀ´½²£¬¾ÍÊǶԹ²Ïí×ÊÔ´µÄÇÀÕ¼ÎÊÌâ¡£Èç¹û²»Í¬µÄÇëÇó¶Ôͬһ¸ö»òÕßͬһ×é×ÊÔ´¶ÁÈ¡²¢ÐÞ¸Äʱ£¬ÎÞ·¨±£Ö¤°´ÐòÖ´ÐУ¬ÎÞ·¨±£Ö¤Ò»¸ö²Ù×÷µÄÔ×ÓÐÔ£¬ÄÇô¾ÍºÜÓпÉÄÜ»á³öÏÖÔ¤ÆÚÍâµÄÇé¿ö¡£Òò´Ë²Ù×÷µÄ»¥³âÐÔÎÊÌ⣬Ҳ¿ÉÒÔÀí½âΪһ¸öÐèÒª±£Ö¤Ê±ÐòÐÔ¡¢Ô×ÓÐÔµÄÎÊÌâ¡£
ÔÚ´«Í³µÄ»ùÓÚÊý¾Ý¿âµÄ¼Ü¹¹ÖУ¬¶ÔÓÚÊý¾ÝµÄÇÀÕ¼ÎÊÌâÍùÍùÊÇͨ¹ýÊý¾Ý¿âÊÂÎñ£¨ACID£©À´±£Ö¤µÄ¡£ÔÚ·Ö²¼Ê½»·¾³ÖУ¬³öÓÚ¶ÔÐÔÄÜÒÔ¼°Ò»ÖÂÐÔÃô¸Ð¶ÈµÄÒªÇó£¬Ê¹µÃ·Ö²¼Ê½Ëø³ÉΪÁËÒ»ÖֱȽϳ£¼û¶ø¸ßЧµÄ½â¾ö·½°¸¡£
ÊÂʵÉÏ£¬²Ù×÷»¥³âÐÔÎÊÌâÒ²²¢·Ç·Ö²¼Ê½»·¾³Ëù¶ÀÓУ¬ÔÚ´«Í³µÄ¶àÏ̡߳¢¶à½ø³ÌÇé¿öÏÂÒѾÓÐÁ˺ܺõĽâ¾ö·½°¸¡£Òò´ËÔÚÑо¿·Ö²¼Ê½ËøÖ®Ç°£¬ÎÒÃÇÏÈÀ´·ÖÎöÏÂÕâÁ½ÖÖÇé¿öµÄ½â¾ö·½°¸£¬ÒÔÆÚÄܹ»¶Ô·Ö²¼Ê½ËøµÄ½â¾ö·½°¸ÌṩһЩʵÏÖ˼·¡£
¶àÏ̻߳·¾³½â¾ö·½°¸¼°ÔÀí
½â¾ö·½°¸
¡¶Thinking in Java¡·ÊéÖÐдµ½£º
»ù±¾ÉÏËùÓеIJ¢·¢Ä£Ê½ÔÚ½â¾öÏ̳߳åÍ»ÎÊÌâµÄʱºò£¬¶¼ÊDzÉÓÃÐòÁл¯·ÃÎʹ²Ïí×ÊÔ´µÄ·½°¸¡£
ÔÚ¶àÏ̻߳·¾³ÖУ¬Ïß³ÌÖ®¼äÒòΪ¹«ÓÃһЩ´æ´¢¿Õ¼ä£¬³åÍ»ÎÊÌâʱÓз¢Éú¡£½â¾ö³åÍ»ÎÊÌâ×îÆÕ±éµÄ·½Ê½¾ÍÊÇÓû¥³âËø°Ñ¸Ã×ÊÔ´»ò¶Ô¸Ã×ÊÔ´µÄ²Ù×÷±£»¤ÆðÀ´¡£
Java JDKÖÐÌṩÁËÁ½ÖÖ»¥³âËøLockºÍsynchronized¡£²»Í¬µÄÏß³ÌÖ®¼ä¶Ôͬһ×ÊÔ´½øÐÐÇÀÕ¼£¬¸Ã×ÊԴͨ³£±íÏÖΪij¸öÀàµÄÆÕͨ³ÉÔ±±äÁ¿¡£Òò´Ë£¬ÀûÓÃReentrantLock»òÕßsynchronized½«¹²ÏíµÄ±äÁ¿¼°Æä²Ù×÷Ëø×¡£¬¼´¿É»ù±¾½â¾ö×ÊÔ´ÇÀÕ¼µÄÎÊÌâ¡£
ÏÂÃæÀ´¼òµ¥ÁÄÒ»ÁÄÁ½ÕßµÄʵÏÖÔÀí¡£
ÔÀí
ReentrantLock
ReentrantLockÖ÷ÒªÀûÓÃCAS+CLH¶ÓÁÐÀ´ÊµÏÖ¡£ËüÖ§³Ö¹«Æ½ËøºÍ·Ç¹«Æ½Ëø£¬Á½ÕßµÄʵÏÖÀàËÆ¡£
CAS£ºCompare and Swap£¬±È½Ï²¢½»»»¡£CASÓÐ3¸ö²Ù×÷Êý£ºÄÚ´æÖµV¡¢Ô¤ÆÚÖµA¡¢ÒªÐ޸ĵÄÐÂÖµB¡£µ±ÇÒ½öµ±Ô¤ÆÚÖµAºÍÄÚ´æÖµVÏàͬʱ£¬½«ÄÚ´æÖµVÐÞ¸ÄΪB£¬·ñÔòʲô¶¼²»×ö¡£¸Ã²Ù×÷ÊÇÒ»¸öÔ×Ó²Ù×÷£¬±»¹ã·ºµÄÓ¦ÓÃÔÚJavaµÄµ×²ãʵÏÖÖС£ÔÚJavaÖУ¬CASÖ÷ÒªÊÇÓÉsun.misc.UnsafeÕâ¸öÀàͨ¹ýJNIµ÷ÓÃCPUµ×²ãÖ¸ÁîʵÏÖ¡£
CLH¶ÓÁУº´øÍ·½áµãµÄË«Ïò·ÇÑ»·Á´±í(ÈçÏÂͼËùʾ)£º

ReentrantLockµÄ»ù±¾ÊµÏÖ¿ÉÒÔ¸ÅÀ¨Îª£ºÏÈͨ¹ýCAS³¢ÊÔ»ñÈ¡Ëø¡£Èç¹û´ËʱÒѾÓÐÏß³ÌÕ¼¾ÝÁËËø£¬ÄǾͼÓÈëCLH¶ÓÁв¢ÇÒ±»¹ÒÆð¡£µ±Ëø±»ÊÍ·ÅÖ®ºó£¬ÅÅÔÚCLH¶ÓÁжÓÊ×µÄÏ̻߳ᱻ»½ÐÑ£¬È»ºóCASÔٴγ¢ÊÔ»ñÈ¡Ëø¡£ÔÚÕâ¸öʱºò£¬Èç¹û£º
·Ç¹«Æ½Ëø£ºÈç¹ûͬʱ»¹ÓÐÁíÒ»¸öÏ߳̽øÀ´³¢ÊÔ»ñÈ¡£¬ÄÇôÓпÉÄÜ»áÈÃÕâ¸öÏß³ÌÇÀÏÈ»ñÈ¡£»
¹«Æ½Ëø£ºÈç¹ûͬʱ»¹ÓÐÁíÒ»¸öÏ߳̽øÀ´³¢ÊÔ»ñÈ¡£¬µ±Ëü·¢ÏÖ×Ô¼º²»ÊÇÔÚ¶ÓÊ׵ϰ£¬¾Í»áÅŵ½¶Ó⣬ÓɶÓÊ×µÄÏ̻߳ñÈ¡µ½Ëø¡£
ÏÂÃæ·ÖÎöÏÂÁ½¸öƬ¶Î£º
final boolean nonfairTryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int nextc = c + acquires; if (nextc < 0) // overflow throw new Error("Maximum lock count exceeded"); setState(nextc); return true; } return false; } |
ÔÚ³¢ÊÔ»ñÈ¡ËøµÄʱºò£¬»áÏȵ÷ÓÃÉÏÃæµÄ·½·¨¡£Èç¹û״̬Ϊ0£¬Ôò±íÃ÷´ËʱÎÞÈËÕ¼ÓÐËø¡£´Ëʱ³¢ÊÔ½øÐÐset£¬Ò»µ©³É¹¦£¬Ôò³É¹¦Õ¼ÓÐËø¡£Èç¹û״̬²»Îª0£¬ÔÙÅжÏÊÇ·ñÊǵ±Ç°Ï̻߳ñÈ¡µ½Ëø¡£Èç¹ûÊǵϰ£¬½«×´Ì¬+1£¬ÒòΪ´Ëʱ¾ÍÊǵ±Ç°Ị̈߳¬ËùÒÔ²»ÓÃCAS¡£ÕâÒ²¾ÍÊÇ¿ÉÖØÈëËøµÄʵÏÖÔÀí¡£
final boolean acquireQueued(final Node node, int arg) { boolean failed = true; try { boolean interrupted = false; for (;;) { final Node p = node.predecessor(); if (p == head && tryAcquire(arg)) { setHead(node); p.next = null; // help GC failed = false; return interrupted; } if (shouldParkAfterFailedAcquire(p, node) && parkAndCheckInterrupt()) interrupted = true; } } finally { if (failed) cancelAcquire(node); } } private final boolean parkAndCheckInterrupt() { LockSupport.park(this); return Thread.interrupted(); } |
¸Ã·½·¨ÊÇÔÚ³¢ÊÔ»ñÈ¡ËøÊ§°Ü¼ÓÈëCHL¶Óβ֮ºó£¬Èç¹û·¢ÏÖǰÐò½ÚµãÊÇhead£¬ÔòCASÔÙ³¢ÊÔ»ñȡһ´Î¡£·ñÔò£¬Ôò»á¸ù¾ÝǰÐò½ÚµãµÄ״̬ÅжÏÊÇ·ñÐèÒª×èÈû¡£Èç¹ûÐèÒª×èÈû£¬Ôòµ÷ÓÃLockSupportµÄpark·½·¨×èÈû¸ÃÏ̡߳£
synchronized
ÔÚJavaÓïÑÔÖдæÔÚÁ½ÖÖÄÚ½¨µÄsynchronizedÓï·¨£ºsynchronizedÓï¾ä¡¢synchronized·½·¨¡£
synchronizedÓï¾ä£ºµ±Ô´´úÂë±»±àÒë³É×Ö½ÚÂëµÄʱºò£¬»áÔÚͬ²½¿éµÄÈë¿ÚλÖúÍÍ˳öλÖ÷ֱð²åÈëmonitorenterºÍmonitorexit×Ö½ÚÂëÖ¸Áî;
synchronized·½·¨£ºÔÚClassÎļþµÄ·½·¨±íÖн«¸Ã·½·¨µÄaccess_flags×Ö¶ÎÖеÄsynchronized±ê־λÖÃ1¡£Õâ¸öÔÚspecificationÖÐûÓÐÃ÷ȷ˵Ã÷¡£
ÔÚJavaÐéÄâ»úµÄspecificationÖУ¬ÓйØÓÚmonitorenterºÍmonitorexit×Ö½ÚÂëÖ¸ÁîµÄÏêϸÃèÊö£ºhttp://docs.oracle.com/Javase/specs/jvms/se7/html/jvms-6.html#jvms-6.5.monitorenter¡£
monitorenter
The objectref must be of type reference.
Each object is associated with a monitor. A monitor
is locked if and only if it has an owner. The
thread that executes monitorenter attempts to
gain ownership of the monitor associated with
objectref, as follows:
If the entry count of the monitor associated
with objectref is zero, the thread enters the
monitor and sets its entry count to one. The thread
is then the owner of the monitor.
If the thread already owns the monitor associated
with objectref, it reenters the monitor, incrementing
its entry count.
If another thread already owns the monitor associated
with objectref, the thread blocks until the monitor¡¯s
entry count is zero, then tries again to gain
ownership. |
ÿ¸ö¶ÔÏó¶¼ÓÐÒ»¸öËø£¬Ò²¾ÍÊǼàÊÓÆ÷£¨monitor£©¡£µ±monitor±»Õ¼ÓÐʱ¾Í±íʾËü±»Ëø¶¨¡£Ïß³ÌÖ´ÐÐmonitorenterÖ¸Áîʱ³¢ÊÔ»ñÈ¡¶ÔÏóËù¶ÔÓ¦µÄmonitorµÄËùÓÐȨ£¬¹ý³ÌÈçÏ£º
Èç¹ûmonitorµÄ½øÈëÊýΪ0£¬Ôò¸ÃÏ߳̽øÈëmonitor£¬È»ºó½«½øÈëÊýÉèÖÃΪ1£¬¸ÃÏ̼߳´ÎªmonitorµÄËùÓÐÕß;
Èç¹ûÏß³ÌÒѾӵÓÐÁ˸Ãmonitor£¬Ö»ÊÇÖØÐ½øÈ룬Ôò½øÈëmonitorµÄ½øÈëÊý¼Ó1;
Èç¹ûÆäËûÏß³ÌÒѾռÓÃÁËmonitor£¬Ôò¸ÃÏ߳̽øÈë×èÈû״̬£¬Ö±µ½monitorµÄ½øÈëÊýΪ0£¬ÔÙÖØÐ³¢ÊÔ»ñÈ¡monitorµÄËùÓÐȨ¡£
monitorexit
The objectref must be of type reference.
The thread that executes monitorexit must be
the owner of the monitor associated with the instance
referenced by objectref.
The thread decrements the entry count of the
monitor associated with objectref. If as a result
the value of the entry count is zero, the thread
exits the monitor and is no longer its owner.
Other threads that are blocking to enter the monitor
are allowed to attempt to do so. |
Ö´ÐÐmonitorexitµÄÏ̱߳ØÐëÊÇÏàÓ¦µÄmonitorµÄËùÓÐÕß¡£
Ö¸ÁîÖ´ÐÐʱ£¬monitorµÄ½øÈëÊý¼õ1£¬Èç¹û¼õ1ºó½øÈëÊýΪ0£¬ÄÇÏß³ÌÍ˳ömonitor£¬²»ÔÙÊÇÕâ¸ömonitorµÄËùÓÐÕß¡£ÆäËû±»Õâ¸ömonitor×èÈûµÄÏ߳̿ÉÒÔ³¢ÊÔÈ¥»ñÈ¡Õâ¸ömonitorµÄËùÓÐȨ¡£
ÔÚJDK1.6¼°Æä֮ǰµÄ°æ±¾ÖÐmonitorenterºÍmonitorexit×Ö½ÚÂëÒÀÀµÓڵײãµÄ²Ù×÷ϵͳµÄMutex
LockÀ´ÊµÏֵ쬵«ÊÇÓÉÓÚʹÓÃMutex LockÐèÒª½«µ±Ç°Ïß³Ì¹ÒÆð²¢´ÓÓû§Ì¬Çл»µ½ÄÚºË̬À´Ö´ÐУ¬ÕâÖÖÇл»µÄ´ú¼ÛÊǷdz£°º¹óµÄ¡£È»¶øÔÚÏÖʵÖеĴ󲿷ÖÇé¿öÏ£¬Í¬²½·½·¨ÊÇÔËÐÐÔÚµ¥Ï̻߳·¾³£¨ÎÞËø¾ºÕù»·¾³£©¡£Èç¹ûÿ´Î¶¼µ÷ÓÃMutex
Lock½«ÑÏÖØµÄÓ°Ïì³ÌÐòµÄÐÔÄÜ¡£Òò´ËÔÚJDK 1.6Ö®ºóµÄ°æ±¾ÖжÔËøµÄʵÏÖ×öÁË´óÁ¿µÄÓÅ»¯£¬ÕâЩÓÅ»¯Ôںܴó³Ì¶ÈÉϼõÉÙ»ò±ÜÃâÁËMutex
LockµÄʹÓá£
¶à½ø³ÌµÄ½â¾ö·½°¸
ÔÚ¶àµÀ³ÌÐòϵͳÖдæÔÚÐí¶à½ø³Ì£¬ËüÃǹ²Ïí¸÷ÖÖ×ÊÔ´£¬È»¶øÓкܶà×ÊÔ´Ò»´ÎÖ»Äܹ©Ò»¸ö½ø³ÌʹÓã¬Õâ±ãÊÇÁÙ½ç×ÊÔ´¡£¶à½ø³ÌÖеÄÁÙ½ç×ÊÔ´´óÖÂÉÏ¿ÉÒÔ·ÖΪÁ½À࣬һÀàÊÇÎïÀíÉϵÄÕæÊµ×ÊÔ´£¬Èç´òÓ¡»ú£»Ò»ÀàÊÇÓ²ÅÌ»òÄÚ´æÖеĹ²ÏíÊý¾Ý£¬Èç¹²ÏíÄÚ´æµÈ¡£¶ø½ø³ÌÄÚ»¥³â·ÃÎÊÁÙ½ç×ÊÔ´µÄ´úÂë±»³ÆÎªÁÙ½çÇø¡£
Õë¶ÔÁÙ½ç×ÊÔ´µÄ»¥³â·ÃÎÊ£¬JVM²ãÃæµÄËø¾ÍÒѾʧȥЧÁ¦ÁË¡£ÔÚ¶à½ø³ÌµÄÇé¿öÏ£¬Ö÷Òª»¹ÊÇÀûÓòÙ×÷ϵͳ²ãÃæµÄ½ø³Ì¼äͨÐÅÔÀíÀ´½â¾öÁÙ½ç×ÊÔ´µÄÇÀÕ¼ÎÊÌâ¡£±È½Ï³£¼ûµÄÒ»ÖÖ·½·¨±ãÊÇʹÓÃÐźÅÁ¿£¨Semaphores£©¡£
ÐźÅÁ¿ÔÚPOSIX±ê×¼ÏÂÓÐÁ½ÖÖ£¬·Ö±ðΪÓÐÃûÐźÅÁ¿ºÍÎÞÃûÐźÅÁ¿¡£ÎÞÃûÐźÅÁ¿Í¨³£±£´æÔÚ¹²ÏíÄÚ´æÖУ¬¶øÓÐÃûÐźÅÁ¿ÊÇÓëÒ»¸öÌØ¶¨µÄÎļþÃû³ÆÏà¹ØÁª¡£ÐźÅÁ¿ÊÇÒ»¸öÕûÊý±äÁ¿£¬ÓмÆÊýÐźÅÁ¿ºÍ¶þÖµÐźÅÁ¿Á½ÖÖ¡£¶ÔÐźÅÁ¿µÄ²Ù×÷£¬Ö÷ÒªÊÇP²Ù×÷£¨wait£©ºÍV²Ù×÷£¨signal£©¡£
P²Ù×÷£ºÏȼì²éÐźÅÁ¿µÄ´óС£¬ÈôÖµ´óÓÚÁ㣬Ôò½«ÐźÅÁ¿¼õ1£¬Í¬Ê±½ø³Ì»ñµÃ¹²Ïí×ÊÔ´µÄ·ÃÎÊȨÏÞ£¬¼ÌÐøÖ´ÐУ»ÈôСÓÚ»òÕßµÈÓÚÁ㣬Ôò¸Ã½ø³Ì±»×èÈûºó£¬½øÈëµÈ´ý¶ÓÁС£
V²Ù×÷£º¸Ã²Ù×÷½«ÐźÅÁ¿µÄÖµ¼Ó1£¬Èç¹ûÓнø³Ì×èÈû×ŵȴý¸ÃÐźÅÁ¿£¬ÄÇôÆäÖÐÒ»¸ö½ø³Ì½«±»»½ÐÑ¡£
¾Ù¸öÀý×Ó£¬ÉèÐźÅÁ¿Îª1£¬µ±Ò»¸ö½ø³ÌAÔÚ½øÈëÁÙ½çÇøÖ®Ç°£¬ÏȽøÐÐP²Ù×÷¡£·¢ÏÖÖµ´óÓÚÁ㣬ÄÇô¾Í½«ÐźÅÁ¿¼õΪ0£¬½øÈëÁÙ½çÇøÖ´ÐС£´Ëʱ£¬ÈôÁíÒ»¸ö½ø³ÌBÒ²Òª½øÈ¥ÁÙ½çÇø£¬½øÐÐP²Ù×÷£¬·¢ÏÖÐźÅÁ¿µÈÓÚ0£¬Ôò»á±»×èÈû¡£µ±½ø³ÌAÍ˳öÁÙ½çÇøÊ±£¬»á½øÐÐV²Ù×÷£¬½«ÐźÅÁ¿µÄÖµ¼Ó1£¬²¢»½ÐÑ×èÈûµÄ½ø³ÌB¡£´ËʱB¾Í¿ÉÒÔ½øÈëÁÙ½çÇøÁË¡£
ÕâÖÖ·½Ê½£¬ÆäʵºÍ¶àÏ̻߳·¾³ÏµļӽâËø·Ç³£ÀàËÆ¡£Òò´ËÓÃÐźÅÁ¿´¦ÀíÁÙ½ç×ÊÔ´ÇÀÕ¼£¬Ò²¿ÉÒÔ¼òµ¥µØÀí½âΪ¶ÔÁÙ½çÇø½øÐмÓËø¡£
ͨ¹ýÉÏÃæµÄһЩÁ˽⣬ÎÒÃÇ¿ÉÒÔ¸ÅÀ¨³ö½â¾ö»¥³âÐÔÎÊÌ⣬¼´×ÊÔ´ÇÀÕ¼µÄ»ù±¾·½Ê½Îª£º
¶Ô¹²Ïí×ÊÔ´µÄ²Ù×÷ǰºó£¨½øÈëÍ˳öÁÙ½çÇø£©¼Ó½âËø£¬±£Ö¤²»Í¬Ï̻߳ò½ø³Ì¿ÉÒÔ»¥³âÓÐÐòµÄ²Ù×÷×ÊÔ´¡£
¼Ó½âËø·½Ê½£¬ÓÐÏÔʽµÄ¼Ó½âËø£¬ÈçReentrantLock»òÐźÅÁ¿£»Ò²ÓÐÒþʽµÄ¼Ó½âËø£¬Èçsynchronized¡£ÄÇôÔÚ·Ö²¼Ê½»·¾³ÖУ¬ÎªÁ˱£Ö¤²»Í¬JVM²»Í¬Ö÷»ú¼ä²»»á³öÏÖ×ÊÔ´ÇÀÕ¼£¬ÄÇôͬÑùÖ»Òª¶ÔÁÙ½çÇø¼Ó½âËø¾Í¿ÉÒÔÁË¡£
È»¶øÔÚ¶àÏß³ÌºÍ¶à½ø³ÌÖУ¬ËøÒѾÓбȽÏÍêÉÆµÄʵÏÖ£¬Ö±½ÓʹÓü´¿É¡£µ«ÊÇÔÚ·Ö²¼Ê½»·¾³Ï£¬¾ÍÐèÒªÎÒÃÇ×Ô¼ºÀ´ÊµÏÖ·Ö²¼Ê½Ëø¡£
·Ö²¼Ê½»·¾³ÏµĽâ¾ö·½°¸¡ª¡ª·Ö²¼Ê½Ëø
Ê×ÏÈ£¬ÎÒÃÇÀ´¿´¿´·Ö²¼Ê½ËøµÄ»ù±¾Ìõ¼þ¡£
·Ö²¼Ê½ËøÌõ¼þ
»ù±¾Ìõ¼þ
ÔٻعË϶àÏß³ÌºÍ¶à½ø³Ì»·¾³ÏµÄËø£¬¿ÉÒÔ·¢ÏÖËøµÄʵÏÖÓкܶ๲֮ͨ´¦£¬ËüÃǶ¼ÐèÒªÂú×ãһЩ×î»ù±¾µÄÌõ¼þ£º
ÐèÒªÓÐ´æ´¢ËøµÄ¿Õ¼ä£¬²¢ÇÒËøµÄ¿Õ¼äÊÇ¿ÉÒÔ·ÃÎʵ½µÄ¡£
ËøÐèÒª±»Î¨Ò»±êʶ¡£
ËøÒªÓÐÖÁÉÙÁ½ÖÖ״̬¡£
×Ðϸ·ÖÎöÕâÈý¸öÌõ¼þ£º
´æ´¢¿Õ¼ä
ËøÊÇÒ»¸ö³éÏóµÄ¸ÅÄî£¬ËøµÄʵÏÖ£¬ÐèÒªÒÀ´æÓÚÒ»¸ö¿ÉÒÔ´æ´¢ËøµÄ¿Õ¼ä¡£ÔÚ¶àÏß³ÌÖÐÊÇÄڴ棬ÔÚ¶à½ø³ÌÖÐÊÇÄÚ´æ»òÕß´ÅÅÌ¡£¸üÖØÒªµÄÊÇ£¬Õâ¸ö¿Õ¼äÊÇ¿ÉÒÔ±»·ÃÎʵ½µÄ¡£¶àÏß³ÌÖУ¬²»Í¬µÄÏ̶߳¼¿ÉÒÔ·ÃÎʵ½¶ÑÖеijÉÔ±±äÁ¿£»ÔÚ¶à½ø³ÌÖУ¬²»Í¬µÄ½ø³Ì¿ÉÒÔ·ÃÎʵ½¹²ÏíÄÚ´æÖеÄÊý¾Ý»òÕß´æ´¢ÔÚ´ÅÅÌÖеÄÎļþ¡£µ«ÊÇÔÚ·Ö²¼Ê½»·¾³ÖУ¬²»Í¬µÄÖ÷»úºÜÄÑ·ÃÎʶԷ½µÄÄÚ´æ»ò´ÅÅÌ¡£Õâ¾ÍÐèÒªÒ»¸ö¶¼ÄÜ·ÃÎʵ½µÄÍⲿ¿Õ¼äÀ´×÷Ϊ´æ´¢¿Õ¼ä¡£
×îÆÕ±éµÄÍⲿ´æ´¢¿Õ¼ä¾ÍÊÇÊý¾Ý¿âÁË£¬ÊÂʵÉÏҲȷʵÓлùÓÚÊý¾Ý¿â×ö·Ö²¼Ê½Ëø£¨ÐÐËø¡¢versionÀÖ¹ÛËø£©£¬Èçquartz¼¯Èº¼Ü¹¹ÖоÍÓÐËùʹÓᣳý´ËÒÔÍ⣬»¹Óи÷ʽ»º´æÈçRedis¡¢Tair¡¢Memcached¡¢Mongodb£¬µ±È»»¹ÓÐרÃŵķֲ¼Ê½Ðµ÷·þÎñZookeeper£¬ÉõÖÁÊÇÁíһ̨Ö÷»ú¡£Ö»Òª¿ÉÒÔ´æ´¢Êý¾Ý¡¢ËøÔÚÆäÖпÉÒÔ±»¶àÖ÷»ú·ÃÎʵ½£¬ÄǾͿÉÒÔ×÷Ϊ·Ö²¼Ê½ËøµÄ´æ´¢¿Õ¼ä¡£
Ψһ±êʶ
²»Í¬µÄ¹²Ïí×ÊÔ´£¬±ØÈ»ÐèÒªÓò»Í¬µÄËø½øÐб£»¤£¬Òò´ËÏàÓ¦µÄËø±ØÐëÓÐΨһµÄ±êʶ¡£ÔÚ¶àÏ̻߳·¾³ÖУ¬Ëø¿ÉÒÔÊÇÒ»¸ö¶ÔÏó£¬ÄÇô¶ÔÕâ¸ö¶ÔÏóµÄÒýÓñãÊÇÕâ¸öΨһ±êʶ¡£¶à½ø³Ì»·¾³ÖУ¬ÐźÅÁ¿ÔÚ¹²ÏíÄÚ´æÖÐÒ²ÊÇÓÉÒýÓÃÀ´×÷ΪΨһµÄ±êʶ¡£µ«ÊÇÈç¹û²»ÔÚÄÚ´æÖУ¬Ê§È¥Á˶ÔËøµÄÒýÓã¬ÈçºÎΨһ±êʶËüÄØ£¿ÉÏÎÄÌáµ½µÄÓÐÃûÐźÅÁ¿£¬±ãÊÇÓÃÓ²ÅÌÖеÄÎļþÃû×÷ΪΨһ±êʶ¡£Òò´Ë£¬ÔÚ·Ö²¼Ê½»·¾³ÖУ¬Ö»Òª¸øÕâ¸öËøÉ趨һ¸öÃû³Æ£¬²¢ÇÒ±£Ö¤Õâ¸öÃû³ÆÊÇÈ«¾ÖΨһµÄ£¬ÄÇô¾Í¿ÉÒÔ×÷ΪΨһ±êʶ¡£
ÖÁÉÙÁ½ÖÖ״̬
ΪÁ˸øÁÙ½çÇø¼ÓËøºÍ½âËø£¬ÐèÒª´æ´¢Á½ÖÖ²»Í¬µÄ״̬¡£ÈçReentrantLockÖеÄstatus£¬0±íʾûÓÐÏ߳̾ºÕù£¬´óÓÚ0±íʾÓÐÏ߳̾ºÕù£»ÐźÅÁ¿´óÓÚ0±íʾ¿ÉÒÔ½øÈëÁÙ½çÇø£¬Ð¡ÓÚµÈÓÚ0Ôò±íʾÐèÒª±»×èÈû¡£Òò´ËÖ»ÒªÔÚ·Ö²¼Ê½»·¾³ÖУ¬ËøµÄ״̬ÓÐÁ½ÖÖ»òÒÔÉÏ£ºÈçÓÐËø¡¢Ã»Ëø£»´æÔÚ¡¢²»´æÔڵȣ¬¾ù¿ÉÒÔʵÏÖ¡£
ÓÐÁËÕâÈý¸öÌõ¼þ£¬»ù±¾¾Í¿ÉÒÔʵÏÖÒ»¸ö¼òµ¥µÄ·Ö²¼Ê½ËøÁË¡£ÏÂÃæÒÔÊý¾Ý¿âΪÀý£¬ÊµÏÖÒ»¸ö¼òµ¥µÄ·Ö²¼Ê½Ëø£º
Êý¾Ý¿â±í£¬×Ö¶ÎÎªËøµÄID£¨Î¨Ò»±êʶ£©£¬ËøµÄ״̬£¨0±íʾûÓб»Ëø£¬1±íʾ±»Ëø£©¡£
α´úÂëΪ£º
lock = mysql.get(id); while(lock.status == 1) { sleep(100); } mysql.update(lock.status = 1); doSomething(); mysql.update(lock.status = 0); |
ÎÊÌâ
ÒÔÉϵķ½Ê½¼´¿ÉÒÔʵÏÖÒ»¸ö´Ö²ÚµÄ·Ö²¼Ê½Ëø£¬µ«ÊÇÕâÑùµÄʵÏÖ£¬ÓÐûÓÐʲôÎÊÌâÄØ£¿
ÎÊÌâ1£ºËø×´Ì¬ÅжÏÔ×ÓÐÔÎÞ·¨±£Ö¤
´Ó¶ÁÈ¡ËøµÄ״̬£¬µ½ÅжϸÃ״̬ÊÇ·ñΪ±»Ëø£¬ÐèÒª¾ÀúÁ½²½²Ù×÷¡£Èç¹û²»Äܱ£Ö¤ÕâÁ½²½µÄÔ×ÓÐÔ£¬¾Í¿ÉÄܵ¼Ö²»Ö¹Ò»¸öÇëÇó»ñÈ¡µ½ÁËËø£¬ÕâÏÔÈ»ÊDz»Ðеġ£Òò´Ë£¬ÎÒÃÇÐèÒª±£Ö¤Ëø×´Ì¬ÅжϵÄÔ×ÓÐÔ¡£
ÎÊÌâ2£ºÍøÂç¶Ï¿ª»òÖ÷»úå´»ú£¬Ëø×´Ì¬ÎÞ·¨Çå³ý
¼ÙÉèÔÚÖ÷»úÒѾ»ñÈ¡µ½ËøµÄÇé¿öÏ£¬Í»È»³öÏÖÁËÍøÂç¶Ï¿ª»òÕßÖ÷»úå´»ú£¬Èç¹û²»×öÈκδ¦Àí¸ÃËø½«ÈÔÈ»´¦ÓÚ±»Ëø¶¨µÄ״̬¡£ÄÇô֮ºóËùÓеÄÇëÇó¶¼ÎÞ·¨Ôٳɹ¦ÇÀÕ¼µ½Õâ¸öËø¡£Òò´Ë£¬ÎÒÃÇÐèÒªÔÚ³ÖÓÐËøµÄÖ÷»úå´»ú»òÕßÍøÂç¶Ï¿ªµÄʱºò£¬¼°Ê±µÄÊͷŵôÕâ°ÑËø¡£
ÎÊÌâ3£ºÎÞ·¨±£Ö¤ÊͷŵÄÊÇ×Ô¼ºÉÏËøµÄÄǰÑËø
ÔÚ½â¾öÁËÎÊÌâ2µÄÇé¿öÏÂÔÙÉèÏëһϣ¬¼ÙÉè³ÖÓÐËøµÄÖ÷»úAÔÚÁÙ½çÇøÓöµ½ÍøÂç¶¶¶¯µ¼ÖÂÍøÂç¶Ï¿ª£¬·Ö²¼Ê½Ëø¼°Ê±µÄÊͷŵôÁËÕâ°ÑËø¡£Ö®ºó£¬ÁíÒ»¸öÖ÷»úBÕ¼ÓÐÁËÕâ°ÑËø£¬µ«ÊÇ´ËʱÖ÷»úAÍøÂç»Ö¸´£¬Í˳öÁÙ½çÇøÊ±½âËø¡£ÓÉÓÚ¶¼ÊÇͬһ°ÑËø£¬ËùÒÔA¾Í»á½«BµÄËø½â¿ª¡£´ËʱÈç¹ûÓеÚÈý¸öÖ÷»ú³¢ÊÔÇÀÕ¼Õâ°ÑËø£¬Ò²½«»á³É¹¦»ñµÃ¡£Òò´Ë£¬ÎÒÃÇÐèÒªÔÚ½âËøÊ±£¬È·¶¨×Ô¼º½âµÄÕâ¸öËøÕýÊÇ×Ô¼ºËøÉϵġ£
½ø½×Ìõ¼þ
Èç¹û·Ö²¼Ê½ËøµÄʵÏÖ£¬»¹ÄÜÔÙ½â¾öÉÏÃæµÄÈý¸öÎÊÌ⣬ÄÇô¾Í¿ÉÒÔËãÊÇÒ»¸öÏà¶ÔÍêÕûµÄ·Ö²¼Ê½ËøÁË¡£È»¶ø£¬ÔÚʵ¼ÊµÄϵͳ»·¾³ÖУ¬»¹»á¶Ô·Ö²¼Ê½ËøÓиü¸ß¼¶µÄÒªÇó¡£
¿ÉÖØÈ룺Ïß³ÌÖеĿÉÖØÈ룬ָµÄÊÇÍâ²ãº¯Êý»ñµÃËøÖ®ºó£¬ÄÚ²ãÒ²¿ÉÒÔ»ñµÃËø£¬ReentrantLockºÍsynchronized¶¼ÊÇ¿ÉÖØÈëËø£»ÑÜÉúµ½·Ö²¼Ê½»·¾³ÖУ¬Ò»°ãÈÔȻָµÄÊÇÏ̵߳ĿÉÖØÈ룬ÔÚ¾ø´ó¶àÊý·Ö²¼Ê½»·¾³ÖУ¬¶¼ÒªÇó·Ö²¼Ê½ËøÊÇ¿ÉÖØÈëµÄ¡£
¾ªÈºÐ§Ó¦£¨Herd Effect£©£ºÔÚ·Ö²¼Ê½ËøÖУ¬¾ªÈºÐ§Ó¦Ö¸µÄÊÇ£¬ÔÚÓжà¸öÇëÇóµÈ´ý»ñÈ¡ËøµÄʱºò£¬Ò»µ©Õ¼ÓÐËøµÄÏß³ÌÊÍ·ÅÖ®ºó£¬Èç¹ûËùÓеȴýµÄ·½¶¼Í¬Ê±±»»½ÐÑ£¬³¢ÊÔÇÀÕ¼Ëø¡£µ«ÊÇÕâÑùµÄÇé¿ö»áÔì³É±È½Ï´óµÄ¿ªÏú£¬ÄÇôÔÚʵÏÖ·Ö²¼Ê½ËøµÄʱºò£¬Ó¦¸Ã¾¡Á¿±ÜÃ⾪ȺЧӦµÄ²úÉú¡£
¹«Æ½ËøºÍ·Ç¹«Æ½Ëø£º²»Í¬µÄÐèÇ󣬿ÉÄÜÐèÒª²»Í¬µÄ·Ö²¼Ê½Ëø¡£·Ç¹«Æ½ËøÆÕ±é±È¹«Æ½Ëø¿ªÏúС¡£µ«ÊÇÒµÎñÐèÇóÈç¹û±ØÐëÒªËøµÄ¾ºÕùÕß°´Ë³Ðò»ñµÃËø£¬ÄÇô¾ÍÐèҪʵÏÖ¹«Æ½Ëø¡£
×èÈûËøºÍ×ÔÐýËø£ºÕë¶Ô²»Í¬µÄʹÓó¡¾°£¬×èÈûËøºÍ×ÔÐýËøµÄЧÂÊÒ²»áÓÐËù²»Í¬¡£×èÈûËø»áÓÐÉÏÏÂÎÄÇл»£¬Èç¹û²¢·¢Á¿±È½Ï¸ßÇÒÁÙ½çÇøµÄ²Ù×÷ºÄʱ±È½Ï¶Ì£¬ÄÇôÔì³ÉµÄÐÔÄÜ¿ªÏú¾Í±È½Ï´óÁË¡£µ«ÊÇÈç¹ûÁÙ½çÇø²Ù×÷ºÄʱ±È½Ï³¤£¬Ò»Ö±±£³Ö×ÔÐý£¬Ò²»á¶ÔCPUÔì³É¸ü´óµÄ¸ººÉ¡£
±£ÁôÒÔÉÏËùÓÐÎÊÌâºÍÌõ¼þ£¬ÎÒÃǽÓÏÂÀ´¿´Ò»Ð©±È½ÏµäÐ͵ÄʵÏÖ·½°¸¡£
µäÐÍʵÏÖ
ZooKeeperµÄʵÏÖ
ZooKeeper£¨ÒÔϼò³Æ¡°ZK¡±£©ÖÐÓÐÒ»ÖÖ½Úµã½Ð×ö˳Ðò½Úµã£¬¼ÙÈçÎÒÃÇÔÚ/lock/Ŀ¼Ï´´½¨3¸ö½Úµã£¬ZK¼¯Èº»á°´ÕÕ·¢Æð´´½¨µÄ˳ÐòÀ´´´½¨½Úµã£¬½Úµã·Ö±ðΪ/lock/0000000001¡¢/lock/0000000002¡¢/lock/0000000003¡£
ZKÖл¹ÓÐÒ»ÖÖÃûΪÁÙʱ½ÚµãµÄ½Úµã£¬ÁÙʱ½ÚµãÓÉij¸ö¿Í»§¶Ë´´½¨£¬µ±¿Í»§¶ËÓëZK¼¯Èº¶Ï¿ªÁ¬½Ó£¬Ôò¸Ã½Úµã×Ô¶¯±»É¾³ý¡£EPHEMERAL_SEQUENTIALΪÁÙʱ˳Ðò½Úµã¡£
¸ù¾ÝZKÖнڵãÊÇ·ñ´æÔÚ£¬¿ÉÒÔ×÷Ϊ·Ö²¼Ê½ËøµÄËø×´Ì¬£¬ÒÔ´ËÀ´ÊµÏÖÒ»¸ö·Ö²¼Ê½Ëø£¬ÏÂÃæÊÇ·Ö²¼Ê½ËøµÄ»ù±¾Âß¼£º
¿Í»§¶Ëµ÷ÓÃcreate()·½·¨´´½¨ÃûΪ¡°/dlm-locks/lockname/lock-¡±µÄÁÙʱ˳Ðò½Úµã¡£
¿Í»§¶Ëµ÷ÓÃgetChildren(¡°lockname¡±)·½·¨À´»ñÈ¡ËùÓÐÒѾ´´½¨µÄ×ӽڵ㡣
¿Í»§¶Ë»ñÈ¡µ½ËùÓÐ×Ó½ÚµãpathÖ®ºó£¬Èç¹û·¢ÏÖ×Ô¼ºÔÚ²½Öè1Öд´½¨µÄ½ÚµãÊÇËùÓнڵãÖÐÐòºÅ×îСµÄ£¬ÄÇô¾ÍÈÏΪÕâ¸ö¿Í»§¶Ë»ñµÃÁËËø¡£
Èç¹û´´½¨µÄ½Úµã²»ÊÇËùÓнڵãÖÐÐèÒª×îСµÄ£¬ÄÇôÔò¼àÊÓ±È×Ô¼º´´½¨½ÚµãµÄÐòÁкÅСµÄ×î´óµÄ½Úµã£¬½øÈëµÈ´ý¡£Ö±µ½Ï´μàÊÓµÄ×Ó½Úµã±ä¸üµÄʱºò£¬ÔÙ½øÐÐ×Ó½ÚµãµÄ»ñÈ¡£¬ÅжÏÊÇ·ñ»ñÈ¡Ëø¡£
ÊÍ·ÅËøµÄ¹ý³ÌÏà¶Ô±È½Ï¼òµ¥£¬¾ÍÊÇɾ³ý×Ô¼º´´½¨µÄÄǸö×ӽڵ㼴¿É£¬²»¹ýÒ²ÈÔÐèÒª¿¼ÂÇɾ³ý½Úµãʧ°ÜµÈÒì³£Çé¿ö¡£
¿ªÔ´µÄ»ùÓÚZKµÄMenagerieµÄÔ´Âë¾ÍÊÇÒ»¸öµäÐ͵ÄÀý×Ó£ºhttps://github.com/sfines/menagerie
¡£
MenagerieÖеÄlockÊ×ÏÈʵÏÖÁË¿ÉÖØÈëËø£¬ÀûÓÃThreadLocal´æ´¢½øÈëµÄ´ÎÊý£¬Ã¿´Î¼ÓËø´ÎÊý¼Ó1£¬Ã¿´Î½âËø´ÎÊý¼õ1¡£Èç¹ûÅжϳöÊǵ±Ç°Ï̳߳ÖÓÐËø£¬¾Í²»ÓÃ×ß»ñÈ¡ËøµÄÁ÷³Ì¡£
ͨ¹ýtryAcquireDistributed·½·¨³¢ÊÔ»ñÈ¡Ëø£¬Ñ»·ÅжÏǰÐò½ÚµãÊÇ·ñ´æÔÚ£¬Èç¹û´æÔÚÔò¼àÊӸýڵ㲢ÇÒ·µ»Ø»ñȡʧ°Ü¡£Èç¹ûǰÐò½Úµã²»´æÔÚ£¬ÔòÔÙÅжϸüǰһ¸ö½Úµã¡£Èç¹ûÅжϳö×Ô¼ºÊǵÚÒ»¸ö½Úµã£¬Ôò·µ»Ø»ñÈ¡³É¹¦¡£
ΪÁËÔÚ±ðµÄÏß³ÌÕ¼ÓÐËøµÄʱºò×èÈû£¬´úÂëÖÐʹÓÃJUCµÄconditionÀ´Íê³É¡£Èç¹û»ñÈ¡³¢ÊÔËøÊ§°Ü£¬Ôò½øÈëµÈ´ýÇÒ·ÅÆúlocalLock£¬µÈ´ýǰÐò½Úµã»½ÐÑ¡£¶ølocalLockÊÇÒ»¸ö±¾µØµÄ¹«Æ½Ëø£¬Ê¹µÃcondition¿ÉÒÔ¹«Æ½µÄ½øÐл½ÐÑ£¬ÅäºÏÑ»·ÅжÏǰÐò½Úµã£¬ÊµÏÖÁËÒ»¸ö¹«Æ½Ëø¡£
ÕâÖÖʵÏÖ·½Ê½·Ç³£ÀàËÆÓÚReentrantLockµÄCHL¶ÓÁУ¬¶øÇÒzkµÄÁÙʱ½Úµã¿ÉÒÔÖ±½Ó±ÜÃâÍøÂç¶Ï¿ª»òÖ÷»úå´»ú£¬Ëø×´Ì¬ÎÞ·¨Çå³ýµÄÎÊÌ⣬˳Ðò½Úµã¿ÉÒÔ±ÜÃ⾪ȺЧӦ¡£ÕâÐ©ÌØÐÔ¶¼Ê¹µÃÀûÓÃZKʵÏÖ·Ö²¼Ê½Ëø³ÉΪÁË×îÆÕ±éµÄ·½°¸Ö®Ò»¡£
RedisµÄʵÏÖ
RedisµÄ·Ö²¼Ê½»º´æÌØÐÔʹÆä³ÉΪÁË·Ö²¼Ê½ËøµÄÒ»ÖÖ»ù´¡ÊµÏÖ¡£Í¨¹ýRedisÖÐÊÇ·ñ´æÔÚij¸öËøID£¬Ôò¿ÉÒÔÅжÏÊÇ·ñÉÏËø¡£ÎªÁ˱£Ö¤ÅжÏËøÊÇ·ñ´æÔÚµÄÔ×ÓÐÔ£¬±£Ö¤Ö»ÓÐÒ»¸öÏ̻߳ñȡͬһ°ÑËø£¬RedisÓÐSETNX£¨¼´SET
if Not
eXists£©ºÍGETSET£¨ÏÈдÐÂÖµ£¬·µ»Ø¾ÉÖµ£¬Ô×ÓÐÔ²Ù×÷£¬¿ÉÒÔÓÃÓÚ·Ö±æÊDz»ÊÇÊ״βÙ×÷£©²Ù×÷¡£
ΪÁË·ÀÖ¹Ö÷»úå´»ú»òÍøÂç¶Ï¿ªÖ®ºóµÄËÀËø£¬RedisûÓÐZKÄÇÖÖÌìÈ»µÄʵÏÖ·½Ê½£¬Ö»ÄÜÒÀÀµÉèÖó¬Ê±Ê±¼äÀ´¹æ±Ü¡£
ÒÔÏÂÊÇÒ»ÖÖ±È½ÏÆÕ±éµ«²»Ì«ÍêÉÆµÄRedis·Ö²¼Ê½ËøµÄʵÏÖ²½Ö裨ÓëÏÂͼһһ¶ÔÓ¦£©£º
1.Ïß³ÌA·¢ËÍSETNX lock.orderid³¢ÊÔ»ñµÃËø£¬Èç¹ûËø²»´æÔÚ£¬Ôòset²¢»ñµÃËø¡£
2.Èç¹ûËø´æÔÚ£¬ÔòÔÙÅжÏËøµÄÖµ£¨Ê±¼ä´Á£©ÊÇ·ñ´óÓÚµ±Ç°Ê±¼ä£¬Èç¹ûûÓг¬Ê±£¬ÔòµÈ´ýÒ»ÏÂÔÙÖØÊÔ¡£
3.Èç¹ûÒѾ³¬Ê±ÁË£¬ÔÚÓÃGETSET lock.{orderid}À´³¢ÊÔ»ñÈ¡Ëø£¬Èç¹ûÕâʱºòÄõ½µÄʱ¼ä´ÁÈԾɳ¬Ê±£¬Ôò˵Ã÷ÒѾ»ñµÃËøÁË¡£
4.Èç¹ûÔÚ´Ë֮ǰ£¬ÁíÒ»¸öÏß³ÌC¿ìÒ»²½Ö´ÐÐÁËÉÏÃæµÄ²Ù×÷£¬ÄÇôAÄõ½µÄʱ¼ä´ÁÊǸöδ³¬Ê±µÄÖµ£¬ÕâʱAûÓÐÈçÆÚ»ñµÃËø£¬ÐèÒªÔٴεȴý»òÖØÊÔ¡£

¸ÃʵÏÖ»¹ÓÐÒ»¸öÐèÒª¿¼ÂǵÄÎÊÌâÊÇÈ«¾ÖʱÖÓÎÊÌ⣬ÓÉÓÚÉú²ú»·¾³Ö÷»úʱÖÓ²»Äܱ£Ö¤Íêȫͬ²½£¬¶Ôʱ¼ä´ÁµÄÅжÏÒ²¿ÉÄÜ»á²úÉúÎó²î¡£
ÒÔÉÏÊÇRedisµÄÒ»ÖÖ³£¼ûµÄʵÏÖ·½Ê½£¬³ý´ËÒÔÍ⻹¿ÉÒÔÓÃSETNX+EXPIREÀ´ÊµÏÖ¡£RedissonÊÇÒ»¸ö¹Ù·½ÍƼöµÄRedis¿Í»§¶Ë²¢ÇÒʵÏÖÁ˺ܶà·Ö²¼Ê½µÄ¹¦ÄÜ¡£ËüµÄ·Ö²¼Ê½Ëø¾ÍÌṩÁËÒ»ÖÖ¸üÍêÉÆµÄ½â¾ö·½°¸£¬Ô´Â룺https://github.com/mrniko/redisson¡£
TairµÄʵÏÖ
TairºÍRedisµÄʵÏÖÀàËÆ£¬Tair¿Í»§¶Ë·â×°ÁËÒ»¸öexpireLockµÄ·½·¨£ºÍ¨¹ýËø×´Ì¬ºÍ¹ýÆÚʱ¼ä´ÁÀ´¹²Í¬ÅжÏËøÊÇ·ñ´æÔÚ£¬Ö»ÓÐËøÒѾ´æÔÚÇÒûÓйýÆÚµÄ״̬²ÅÅж¨ÎªÓÐËø×´Ì¬¡£ÔÚÓÐËø×´Ì¬Ï£¬²»ÄܼÓËø£¬ÄÜͨ¹ý´óÓÚ»òµÈÓÚ¹ýÆÚʱ¼äµÄʱ¼ä´Á½øÐнâËø¡£
²ÉÓÃÕâÑùµÄ·½Ê½£¬¿ÉÒÔ²»ÓÃÔÚValueÖд洢ʱ¼ä´Á£¬²¢ÇÒ±£Ö¤ÁËÅжÏÊÇ·ñÓÐËøµÄÔ×ÓÐÔ¡£¸üÖµµÃ×¢ÒâµÄÊÇ£¬ÓÉÓÚ³¬Ê±Ê±¼äÊÇÓÉTairÅжϣ¬ËùÒÔ±ÜÃâÁ˲»Í¬Ö÷»úʱÖÓ²»Ò»ÖµÄÇé¿ö¡£
ÒÔÉϵļ¸ÖÖ·Ö²¼Ê½ËøÊµÏÖ·½Ê½£¬¶¼ÊDZȽϳ£¼ûÇÒÓÐЩÒѾÔÚÉú²ú»·¾³ÖÐÓ¦Óá£Ëæ×ÅÓ¦Óû·¾³Ô½À´Ô½¸´ÔÓ£¬ÕâЩʵÏÖ¿ÉÄÜÈÔÈ»»áÓöµ½Ò»Ð©ÌôÕ½¡£
Ç¿ÒÀÀµÓÚÍⲿ×é¼þ£º·Ö²¼Ê½ËøµÄʵÏÖ¶¼ÐèÒªÒÀÀµÓÚÍⲿÊý¾Ý´æ´¢ÈçZK¡¢RedisµÈ£¬Òò´ËÒ»µ©ÕâЩÍⲿ×é¼þ³öÏÖ¹ÊÕÏ£¬ÄÇô·Ö²¼Ê½Ëø¾Í²»¿ÉÓÃÁË¡£
ÎÞ·¨ÍêÈ«Âú×ãÐèÇ󣺲»Í¬·Ö²¼Ê½ËøµÄʵÏÖ£¬¶¼ÓÐÏàÓ¦µÄÌØµã£¬¶ÔÓÚһЩÐèÇó²¢²»ÄܺܺõÄÂú×㣬ÈçʵÏÖ¹«Æ½Ëø¡¢¸øµÈ´ýËø¼Ó³¬Ê±Ê±¼äµÈ¡£
»ùÓÚÒÔÉÏÎÊÌ⣬½áºÏ¶àÖÖʵÏÖ·½Ê½£¬ÎÒÃÇ¿ª·¢ÁËCerberus£¨µÃÃû×ÔÏ£À°Éñ»°ÀïÊØÎÀµØÓüµÄÃÍÈ®£©£¬ÖÂÁ¦ÓÚÌṩÁé»î¿É¿¿µÄ·Ö²¼Ê½Ëø¡£
Cerberus·Ö²¼Ê½Ëø
CerberusÓÐÒÔϼ¸¸öÌØµã¡£
ÌØµãÒ»£ºÒ»Ì×½Ó¿Ú¶àÖÖÒýÇæ
Cerberus·Ö²¼Ê½ËøÊ¹ÓÃÁ˶àÖÖÒýÇæÊµÏÖ·½Ê½£¨Tair¡¢ZK¡¢Î´À´Ö§³ÖRedis£©£¬Ö§³ÖʹÓ÷½×ÔÖ÷Ñ¡ÔñËùÐèµÄÒ»ÖÖ»ò¶àÖÖÒýÇæ¡£ÕâÑù¿ÉÒÔ½áºÏÒýÇæÌØµã£¬Ñ¡Ôñ·ûºÏʵ¼ÊÒµÎñÐèÇóºÍϵͳ¼Ü¹¹µÄ·½Ê½¡£
Cerberus·Ö²¼Ê½Ëø½«²»Í¬ÒýÇæµÄ½Ó¿Ú³éÏóΪһÌ×£¬ÆÁ±ÎÁ˲»Í¬ÒýÇæµÄʵÏÖϸ½Ú¡£Ê¹µÃʹÓ÷½¿ÉÒÔרעÓÚÒµÎñÂß¼£¬Ò²¿ÉÒÔÈÎÒâÑ¡Ôñ²¢Çл»ÒýÇæ¶ø²»±Ø¸ü¸ÄÈκεÄÒµÎñ´úÂë¡£
Èç¹ûʹÓ÷½Ñ¡ÔñÁËÒ»ÖÖÒÔÉϵÄÒýÇæ£¬ÄÇôÒÔÅäÖÃ˳ÐòÀ´Çø·ÖÖ÷¸±ÒýÇæ¡£ÒÔÏÂÊÇʹÓÃÖ÷ÒýÇæµÄÍÆ¼ö£º

ÌØµã¶þ£ºÊ¹ÓÃÁé»î¡¢Ñ§Ï°³É±¾µÍ
ÏÂÃæÊÇCerberusµÄlock·½·¨£¬ÕâЩ·½·¨ºÍJUCµÄReentrantLockµÄ·½Ê½±£³ÖÒ»Ö£¬Ê¹Ó÷dz£Áé»îÇÒ²»ÐèÒª¶îÍâµÄѧϰʱ¼ä¡£
void lock();
»ñÈ¡Ëø£¬Èç¹ûËø±»Õ¼Ó㬽«½ûÓõ±Ç°Ị̈߳¬²¢ÇÒÔÚ»ñµÃËøÖ®Ç°£¬¸ÃÏ߳̽«Ò»Ö±´¦ÓÚ×èÈû״̬¡£
boolean tryLock();
½öÔÚµ÷ÓÃÊ±ËøÎª¿ÕÏÐ״̬²Å»ñÈ¡¸ÃËø¡£
Èç¹ûËø¿ÉÓã¬Ôò»ñÈ¡Ëø£¬²¢Á¢¼´·µ»ØÖµtrue¡£Èç¹ûËø²»¿ÉÓã¬Ôò´Ë·½·¨½«Á¢¼´·µ»ØÖµfalse¡£
boolean tryLock(long time, TimeUnit unit) throws InterruptedException;
Èç¹ûËøÔÚ¸ø¶¨µÄµÈ´ýʱ¼äÄÚ¿ÕÏУ¬²¢ÇÒµ±Ç°Ïß³Ìδ±»Öжϣ¬Ôò»ñÈ¡Ëø¡£
Èç¹ûÔÚ¸ø¶¨Ê±¼äÄÚËø¿ÉÓã¬Ôò»ñÈ¡Ëø£¬²¢Á¢¼´·µ»ØÖµtrue¡£Èç¹ûÔÚ¸ø¶¨Ê±¼äÄÚËøÒ»Ö±²»¿ÉÓã¬Ôò´Ë·½·¨½«Á¢¼´·µ»ØÖµfalse¡£
void lockInterruptibly() throws InterruptedException;
»ñÈ¡Ëø£¬Èç¹ûËø±»Õ¼Óã¬ÔòÒ»Ö±µÈ´ýÖ±µ½Ï̱߳»ÖжϻòÕß»ñÈ¡µ½Ëø¡£
void unlock();
Êͷŵ±Ç°³ÖÓеÄËø¡£
ÌØµãÈý£ºÖ§³ÖÒ»¼ü½µ¼¶
CerberusÌṩÁËʵʱÇл»ÒýÇæµÄ½Ó¿Ú:
String switchEngine()
ת»»·Ö²¼Ê½ËøÒýÇæ£¬°´ÅäÖõÄÒýÇæµÄ˳ÐòÑ»·×ª»»¡£
·µ»ØÖµ£º·µ»Øµ±Ç°µÄengineÃû×Ö£¬È磺¡±zk¡±¡£
String switchEngine(String engineName)
ת»»·Ö²¼Ê½ËøÒýÇæ£¬Çл»ÎªÖ¸¶¨µÄÒýÇæ¡£
²ÎÊý£ºengineName - ÒýÇæµÄÃû×Ö£¬Í¬ÅäÖÃbeanµÄÃû×Ö£¬¡±zk¡±/¡±tair¡±¡£
·µ»ØÖµ£º·µ»Øµ±Ç°µÄengineÃû×Ö£¬È磺¡±zk¡±¡£
µ±Ê¹Ó÷½Ñ¡ÔñÁËÁ½ÖÖÒýÇæ£¬Æ½Ê±·Ö²¼Ê½Ëø»á¹¤×÷ÔÚÖ÷ÒýÇæÉÏ¡£Ò»µ©ËùÒÀÀµµÄÖ÷ÒýÇæ³öÏÖ¹ÊÕÏ£¬ÄÇôʹÓ÷½¿ÉÒÔͨ¹ý×Ô¶¯»òÕßÊÖ¶¯·½Ê½µ÷ÓøÃÇл»ÒýÇæ½Ó¿Ú£¬Æ½»¬µÄ½«·Ö²¼Ê½ËøÇл»µ½ÁíÒ»¸öÒýÇæÉÏÒÔ½«·çÏÕ½µµ½×îµÍ¡£×Ô¶¯Çл»·½Ê½¿ÉÒÔÀûÓÃHystrixʵÏÖ¡£ÊÖ¶¯Çл»ÍƼöµÄÒ»¸ö·½°¸ÔòÊÇʹÓÃÃÀÍŵãÆÀ»ùÓÚZookeeperµÄ»ù´¡×é¼þMCC£¬Í¨¹ý¼àÌýMCCÅäÖÃÏî¸ü¸Ä£¬À´´ïµ½ÊÖ¶¯½«·Ö²¼Ê½ÏµÍ³ËùÓÐÖ÷»úͬ²½Çл»ÒýÇæµÄÄ¿µÄ¡£ÐèҪעÒâµÄÊÇ£¬Çл»ÒýÇæÄ¿Ç°²¢²»»áÇ¨ÒÆÔÒýÇæÒÑÓеÄËø¡£ÕâÑù×öµÄÄ¿µÄÊdzöÓÚ±ØÒªÐÔ¡¢ÏµÍ³¸´ÔӶȺͿɿ¿ÐÔµÄ×ۺϿ¼ÂÇ¡£ÔÚʵ¼ÊÇé¿öÏ£¬ÒýÇæ¹ÊÕϵ½Çл»ÒýÇæ£¬ÓÈÆäÊÇÊÖ¶¯Çл»ÒýÇæµÄʱ¼ä£¬ÒªÔ¶´óÓÚ·Ö²¼Ê½ËøµÄ´æ»îʱ¼ä¡£×÷Ϊ½ÏÇáÁ¿¼¶µÄCerberusÀ´Ëµ£¬Ç¨ÒÆËø»á´øÀ´²»±ØÒªµÄ¿ªÏúÒÔ¼°½Ï¸ßµÄϵͳ¸´ÔÓ¶È¡£¼øÓÚ´Ë£¬Èç¹ûÏëÒª±£Ö¤ÔÚÒýÇæ¹ÊÕϺóµÄ¾ø¶Ô¿É¿¿£¬ÄÇôÔòÐèÒª½áºÏÆäËû·½°¸À´½øÐд¦Àí¡£
³ý´ËÒÔÍ⣬Cerberus»¹ÌṩÁËÄÚÖù«Óü¯Èº£¬ÃâÈ¥´î½¨ºÍÅäÖü¯ÈºµÄ·³ÄÕ¡£CerberusÒ²ÓÐÒ»Ì×ÍêÉÆµÄÓ¦ÓÃÊÚȨ»úÖÆ£¬ÒÔ´Ë·ÀÖ¹ÒµÎñ·½Î´¾ÆÀ¹ÀʹÓ㬶Լ¯ÈºÔì³ÉÓ°Ïì¡£
Ŀǰ£¬Cerberus·Ö²¼Ê½ËøÒѾ³ÖÐøµü´úÁË8¸ö°æ±¾£¬ÏȺóÔÚÃÀÍŵãÆÀ¶à¸öÏîÄ¿ÖÐÎȶ¨ÔËÐС£
ÃݵÈÐÔÎÊÌâ
ËùνÃݵȣ¬¼òµ¥µØËµ£¬¾ÍÊǶԽӿڵĶà´Îµ÷ÓÃËù²úÉúµÄ½á¹ûºÍµ÷ÓÃÒ»´ÎÊÇÒ»Öµġ£À©Õ¹Ò»Ï£¬ÕâÀïµÄ½Ó¿Ú£¬¿ÉÒÔÀí½âΪ¶ÔÍâ·¢²¼µÄHTTP½Ó¿Ú»òÕßThrift½Ó¿Ú£¬Ò²¿ÉÒÔÊǽÓÊÕÏûÏ¢µÄÄÚ²¿½Ó¿Ú£¬ÉõÖÁÊÇÒ»¸öÄÚ²¿·½·¨»ò²Ù×÷¡£
ÄÇôÎÒÃÇΪʲôÐèÒª½Ó¿Ú¾ßÓÐÃݵÈÐÔÄØ£¿ÉèÏëÒ»ÏÂÒÔÏÂÇéÐΣº
ÔÚAppÖÐ϶©µ¥µÄʱºò£¬µã»÷È·ÈÏÖ®ºó£¬Ã»·´Ó¦£¬¾ÍÓÖµã»÷Á˼¸´Î¡£ÔÚÕâÖÖÇé¿öÏ£¬Èç¹ûÎÞ·¨±£Ö¤¸Ã½Ó¿ÚµÄÃݵÈÐÔ£¬ÄÇô½«»á³öÏÖÖØ¸´Ïµ¥ÎÊÌâ¡£
ÔÚ½ÓÊÕÏûÏ¢µÄʱºò£¬ÏûÏ¢ÍÆËÍÖØ¸´¡£Èç¹û´¦ÀíÏûÏ¢µÄ½Ó¿ÚÎÞ·¨±£Ö¤Ãݵȣ¬ÄÇÃ´ÖØ¸´Ïû·ÑÏûÏ¢²úÉúµÄÓ°Ïì¿ÉÄÜ»á·Ç³£´ó¡£
ÔÚ·Ö²¼Ê½»·¾³ÖУ¬ÍøÂç»·¾³¸ü¼Ó¸´ÔÓ£¬Òòǰ¶Ë²Ù×÷¶¶¶¯¡¢ÍøÂç¹ÊÕÏ¡¢ÏûÏ¢ÖØ¸´¡¢ÏìÓ¦ËÙ¶ÈÂýµÈÔÒò£¬¶Ô½Ó¿ÚµÄÖØ¸´µ÷ÓøÅÂÊ»á±È¼¯ÖÐʽ»·¾³Ï¸ü´ó£¬ÓÈÆäÊÇÖØ¸´ÏûÏ¢ÔÚ·Ö²¼Ê½»·¾³ÖкÜÄѱÜÃâ¡£Tyler
TreatÒ²ÔÚ¡¶You Cannot Have Exactly-Once Delivery¡·Ò»ÎÄÖÐÌáµ½£º
Within the context of a distributed system, you cannot
have exactly-once message delivery.
·Ö²¼Ê½»·¾³ÖУ¬ÓÐЩ½Ó¿ÚÊÇÌìÈ»±£Ö¤ÃݵÈÐԵģ¬Èç²éѯ²Ù×÷¡£ÓÐЩ¶ÔÊý¾ÝµÄÐÞ¸ÄÊÇÒ»¸ö³£Á¿£¬²¢ÇÒÎÞÆäËû¼Ç¼ºÍ²Ù×÷£¬ÄÇÒ²¿ÉÒÔ˵ÊǾßÓÐÃݵÈÐԵġ£ÆäËûÇé¿öÏ£¬ËùÓÐÉæ¼°¶ÔÊý¾ÝµÄÐ޸ġ¢×´Ì¬µÄ±ä¸ü¾Í¶¼ÓбØÒª·ÀÖ¹ÖØ¸´ÐÔ²Ù×÷µÄ·¢Éú¡£Í¨¹ý¼ä½ÓµÄʵÏÖ½Ó¿ÚµÄÃݵÈÐÔÀ´·ÀÖ¹ÖØ¸´²Ù×÷Ëù´øÀ´µÄÓ°Ï죬³ÉΪÁËÒ»ÖÖÓÐЧµÄ½â¾ö·½°¸¡£
GTIS
GTIS¾ÍÊÇÕâÑùµÄÒ»¸ö½â¾ö·½°¸¡£ËüÊÇÒ»¸öÇáÁ¿µÄÖØ¸´²Ù×÷¹Ø¿¨ÏµÍ³£¬ËüÄܹ»È·±£ÔÚ·Ö²¼Ê½»·¾³ÖвÙ×÷µÄΨһÐÔ¡£ÎÒÃÇ¿ÉÒÔÓÃËüÀ´¼ä½Ó±£Ö¤Ã¿¸ö²Ù×÷µÄÃݵÈÐÔ¡£Ëü¾ßÓÐÈçÏÂÌØµã£º
¸ßЧ£ºµÍÑÓʱ£¬µ¥¸ö·½·¨Æ½¾ùÏìӦʱ¼äÔÚ2msÄÚ£¬¼¸ºõ²»»á¶ÔÒµÎñÔì³ÉÓ°Ï죻
¿É¿¿£ºÌṩ½µ¼¶²ßÂÔ£¬ÒÔÓ¦¶ÔÍⲿ´æ´¢ÒýÇæ¹ÊÕÏËùÔì³ÉµÄÓ°Ï죻ÌṩӦÓüøÈ¨£¬Ìṩ¼¯ÈºÅäÖÃ×Ô¶¨Ò壬½µµÍ²»Í¬ÒµÎñÖ®¼äµÄ¸ÉÈÅ£»
¼òµ¥£º½ÓÈë¼ò½Ý·½±ã£¬Ñ§Ï°³É±¾µÍ¡£Ö»Ðè¼òµ¥µÄÅäÖã¬ÔÚ´úÂëÖнøÐÐÁ½¸ö·½·¨µÄµ÷Óü´¿ÉÍê³ÉËùÓеĽÓÈ빤×÷£»
Áé»î£ºÌṩ¶àÖÖ½Ó¿Ú²ÎÊý¡¢Ê¹ÓòßÂÔ£¬ÒÔÂú×㲻ͬµÄÒµÎñÐèÇó¡£
ʵÏÖÔÀí
»ù±¾ÔÀí
GTISµÄʵÏÖ˼·Êǽ«Ã¿Ò»¸ö²»Í¬µÄÒµÎñ²Ù×÷¸³ÓèÆäΨһÐÔ¡£Õâ¸öΨһÐÔÊÇͨ¹ý¶Ô²»Í¬²Ù×÷Ëù¶ÔÓ¦µÄΨһµÄÄÚÈÝÌØÐÔÉú³ÉÒ»¸öΨһµÄÈ«¾ÖIDÀ´ÊµÏֵġ£»ù±¾ÔÔòΪ£ºÏàͬµÄ²Ù×÷Éú³ÉÏàͬµÄÈ«¾ÖID£»²»Í¬µÄ²Ù×÷Éú³É²»Í¬µÄÈ«¾ÖID¡£
Éú³ÉµÄÈ«¾ÖIDÐèÒª´æ´¢ÔÚÍⲿ´æ´¢ÒýÇæÖУ¬Êý¾Ý¿â¡¢RedisÒà»òÊÇTairµÈ¾ù¿ÉʵÏÖ¡£¿¼Âǵ½TairÌìÉú·Ö²¼Ê½ºÍ³Ö¾Ã»¯µÄÓÅÊÆ£¬Ä¿Ç°µÄGTIS´æ´¢ÔÚTairÖС£ÆäÏàÓ¦µÄkeyºÍvalueÈçÏ£º
key£º½«¶ÔÓÚ²»Í¬µÄÒµÎñ£¬²ÉÓÃAPP_KEY+ÒµÎñ²Ù×÷ÄÚÈÝÌØÐÔÉú³ÉÒ»¸öΨһ±êʶtrans_contents¡£È»ºó¶ÔΨһ±êʶ½øÐмÓÃÜÉú³ÉÈ«¾ÖID×÷ΪKey¡£
value£ºcurrent_timestamp + trans_contents£¬current_timestampÓÃÓÚ±êʶµ±Ç°µÄ²Ù×÷Ï̡߳£
ÅжÏÊÇ·ñÖØ¸´£¬Ö÷ÒªÀûÓÃTairµÄSETNX·½·¨£¬Èç¹ûÔÀ´Ã»ÓÐÖµÔòsetÇÒ·µ»Ø³É¹¦£¬Èç¹ûÒѾÓÐÖµÔò·µ»ØÊ§°Ü¡£
ÄÚ²¿Á÷³Ì
GTISµÄÄÚ²¿ÊµÏÖÁ÷³ÌΪ£º
ÒµÎñ·½ÔÚÒµÎñ²Ù×÷֮ǰ£¬Éú³ÉÒ»¸öÄܹ»Î¨Ò»±êʶ¸Ã²Ù×÷µÄtransContents£¬´«ÈëGTIS£»
GTIS¸ù¾Ý´«ÈëµÄtransContents£¬ÓÃMD5Éú³ÉÈ«¾ÖID£»
GTIS½«È«¾ÖID×÷Ϊkey£¬current_timestamp+transContents×÷Ϊvalue·ÅÈëTair½øÐÐsetNx£¬½«½á¹û·µ»Ø¸øÒµÎñ·½£»
ÒµÎñ·½¸ù¾Ý·µ»Ø½á¹ûÈ·¶¨ÄÜ·ñ¿ªÊ¼½øÐÐÒµÎñ²Ù×÷£»
ÈôÄÜ£¬¿ªÊ¼½øÐвÙ×÷£»Èô²»ÄÜ£¬Ôò½áÊøµ±Ç°²Ù×÷£»
ÒµÎñ·½½«²Ù×÷½á¹ûºÍÇëÇó½á¹û´«ÈëGTIS£¬ÏµÍ³½øÐÐÒ»´ÎÇëÇó½á¹ûµÄ¼ìÑ飻
Èô¸Ã´Î²Ù×÷³É¹¦£¬GTIS¸ù¾ÝkeyÈ¡³övalueÖµ£¬¸ú´«ÈëµÄ·µ»Ø½á¹û½øÐбȶԣ¬Èç¹ûÁ½ÕßÏàµÈ£¬Ôò½«¸ÃÈ«¾ÖIDµÄ¹ýÆÚʱ¼ä¸ÄΪ½Ï³¤Ê±¼ä£»
GTIS·µ»Ø×îÖÕ½á¹û¡£
ʵÏÖÄѵã
GTISµÄʵÏÖÄѵãÔÚÓÚÈçºÎ±£Ö¤ÆäÅжÏÖØ¸´µÄ¿É¿¿ÐÔ¡£ÓÉÓÚ·Ö²¼Ê½»·¾³µÄ¸´ÔӶȺÍÒµÎñ²Ù×÷µÄ²»È·¶¨ÐÔ£¬ÔÚÉÏÒ»Õ½ڷֲ¼Ê½ËøµÄʵÏÖÖп¼ÂǵÄÍøÂç¶Ï¿ª»òÖ÷»úå´»úµÈÎÊÌ⣬ͬÑùÐèÒªÔÚGTISÖÐÉè·¨½â¾ö¡£ÕâÀïÁгö¼¸¸öµäÐ͵ij¡¾°£º
Èç¹û²Ù×÷Ö´ÐÐʧ°Ü£¬ÀíÏëµÄÇé¿öÓ¦¸ÃÊÇÁíÒ»¸öÏàͬµÄ²Ù×÷¿ÉÒÔÁ¢¼´½øÐС£Òò´Ë£¬ÐèÒª¶ÔÒµÎñ·½µÄ²Ù×÷½á¹û½øÐÐÅжϣ¬Èç¹û²Ù×÷ʧ°Ü£¬ÄÇô¾ÍÐèÒªÁ¢¼´É¾³ý¸ÃÈ«¾ÖID£»
Èç¹û²Ù×÷³¬Ê±»òÖ÷»úå´»ú£¬µ±Ç°µÄ²Ù×÷ÎÞ·¨¸æÖªGTIS²Ù×÷ÊÇ·ñ³É¹¦¡£ÄÇôÎÒÃDZØÐëÒýÈ볬ʱ»úÖÆ£¬Ò»µ©³¤Ê±¼ä»ñÈ¡²»µ½ÒµÎñ·½µÄ²Ù×÷·´À¡£¬ÄÇôҲÐèÒª¸ÃÈ«¾ÖIDʧЧ£»
½áºÏÉÏÁ½¸ö³¡¾°£¬¼ÈȻȫ¾ÖID»áʧЧ²¢ÇÒ¿ÉÄܻᱻɾ³ý£¬ÄǾÍÐèÒª±£Ö¤É¾³ýµÄ²»ÊÇÁíÒ»¸öÏàͬ²Ù×÷µÄÈ«¾ÖID¡£Õâ¾ÍÐèÒª½«ÌØÊâµÄ±êʶ¼Ç¼ÏÂÀ´£¬²¢ÓÉ´ËÀ´Åжϡ£ÕâÀïËùÓõıêʶΪµ±Ç°Ê±¼ä´Á¡£
¿ÉÒÔ¿´µ½£¬½â¾öÕâЩÎÊÌâµÄ˼·£¬Ò²ºÍÉÏÒ»Õ½ÚÖеÄʵÏÖÓкܶàÀàËÆµÄµØ·½¡£³ý´ËÒÔÍ⣬»¹Óиü¶àµÄ³¡¾°ÐèÒª¿¼ÂǺͽâ¾ö£¬ËùÓзÖÖ§Á÷³ÌÈçÏÂ:

ʹÓÃ˵Ã÷
ʹÓÃʱ£¬ÒµÎñ·½Ö»ÐèÒªÔÚ²Ù×÷µÄǰºóµ÷ÓÃGTISµÄǰÖ÷½·¨ºÍºóÖ÷½·¨£¬ÈçÏÂͼËùʾ¡£Èç¹ûǰÖ÷½·¨·µ»Ø¿É½øÐвÙ×÷£¬Ôò˵Ã÷´ËʱÎÞÖØ¸´²Ù×÷£¬¿ÉÒÔ½øÐС£·ñÔòÔòÖ±½Ó½áÊø²Ù×÷¡£

ʹÓ÷½ÐèÒª¿¼ÂǵÄÖ÷ÒªÊÇÏÂÃæÁ½¸ö²ÎÊý£º
¿Õ¼äÈ«¾ÖÐÔ£ºÒµÎñ·½ÊäÈëµÄÄܹ»±êÖ¾²Ù×÷ΨһÐÔµÄÄÚÈÝÌØÐÔ£¬¿ÉÒÔÊÇΨһÐÔµÄStringÀàÐ͵ÄID£¬Ò²¿ÉÒÔÊÇmap¡¢POJOµÈÐÎʽ¡£Èç¶©µ¥IDµÈ
ʱ¼äÈ«¾ÖÐÔ£ºÈ·¶¨Ôڶ೤ʱ¼äÄÚ²»ÔÊÐíÖØ¸´£¬1СʱÄÚ»¹ÊÇÒ»¸öÔÂÄÚÒà»òÊÇÓÀ¾Ã¡£
´ËÍ⣬GTIS»¹ÌṩÁ˲»Í¬µÄ¹ÊÕÏ´¦Àí²ßÂÔºÍÖØÊÔ»úÖÆ£¬ÒÔ´ËÀ´½µµÍÍⲿ´æ´¢ÒýÇæÒì³£¶ÔϵͳÔì³ÉµÄÓ°Ïì¡£
Ŀǰ£¬GTISÒѾ³ÖÐøµü´úÁË7¸ö°æ±¾£¬¾àÀëµÚÒ»¸ö°æ±¾Óнü1ÄêÖ®¾Ã£¬ÏȺóÔÚÃÀÍŵãÆÀ¶à¸öÏîÄ¿ÖÐÎȶ¨ÔËÐС£
½áÓï
ÔÚ·Ö²¼Ê½»·¾³ÖУ¬²Ù×÷»¥³âÐÔÎÊÌâºÍÃݵÈÐÔÎÊÌâ·Ç³£ÆÕ±é¡£¾¹ý·ÖÎö£¬ÎÒÃÇÕÒ³öÁ˽â¾öÕâÁ½¸öÎÊÌâµÄ»ù±¾Ë¼Â·ºÍʵÏÖÔÀí£¬¸ø³öÁ˾ßÌåµÄ½â¾ö·½°¸¡£
Õë¶Ô²Ù×÷»¥³âÐÔÎÊÌ⣬³£¼ûµÄ×ö·¨±ãÊÇͨ¹ý·Ö²¼Ê½ËøÀ´´¦Àí¶Ô¹²Ïí×ÊÔ´µÄÇÀÕ¼¡£·Ö²¼Ê½ËøµÄʵÏÖ£¬ºÜ´ó³Ì¶È½è¼øÁ˶àÏß³ÌºÍ¶à½ø³Ì»·¾³ÖеĻ¥³âËøµÄʵÏÖÔÀí¡£Ö»ÒªÂú×ãһЩ´æ´¢·½ÃæµÄ»ù±¾Ìõ¼þ£¬²¢ÇÒÄܹ»½â¾öÈçÍøÂç¶Ï¿ªµÈÒì³£Çé¿ö£¬ÄÇô¾Í¿ÉÒÔʵÏÖÒ»¸ö·Ö²¼Ê½Ëø¡£Ä¿Ç°ÒѾÓлùÓÚZookeeperºÍRedisµÈ´æ´¢ÒýÇæµÄ±È½ÏµäÐ͵ķֲ¼Ê½ËøÊµÏÖ¡£µ«ÊÇÓÉÓÚµ¥´æ´¢ÒýÇæµÄ¾ÖÏÞ£¬ÎÒÃÇ¿ª·¢ÁË»ùÓÚZooKeeperºÍTairµÄ¶àÒýÇæ·Ö²¼Ê½ËøCerberus£¬Ëü¾ßÓÐʹÓÃÁé»î·½±ãµÈÖî¶àÓŵ㣬»¹ÌṩÁËÍêÉÆµÄÒ»¼ü½µ¼¶·½°¸¡£
Õë¶Ô²Ù×÷ÃݵÈÐÔÎÊÌ⣬ÎÒÃÇ¿ÉÒÔͨ¹ý·ÀÖ¹ÖØ¸´²Ù×÷À´¼ä½ÓµÄʵÏÖ½Ó¿ÚµÄÃݵÈÐÔ¡£GTISÌṩÁËÒ»Ì׿ɿ¿µÄ½â¾ö·½·¨£ºÒÀÀµÓÚ´æ´¢ÒýÇæ£¬Í¨¹ý¶Ô²»Í¬²Ù×÷Ëù¶ÔÓ¦µÄΨһµÄÄÚÈÝÌØÐÔÉú³ÉÒ»¸öΨһµÄÈ«¾ÖIDÀ´·ÀÖ¹²Ù×÷ÖØ¸´¡£
ĿǰCerberus·Ö²¼Ê½Ëø¡¢GTIS¶¼ÒÑÓ¦ÓÃÔÚÉú²ú»·¾³²¢Æ½ÎÈÔËÐС£Á½ÕßÌṩµÄ½â¾ö·½°¸ÒѾÄܹ»½â¾ö´ó¶àÊý·Ö²¼Ê½»·¾³ÖеIJÙ×÷»¥³âÐÔºÍÃݵÈÐÔµÄÎÊÌâ¡£ÖµµÃÒ»ÌáµÄÊÇ£¬·Ö²¼Ê½ËøºÍGTIS¶¼²»ÊÇÍòÄܵģ¬ËüÃǶÔÍⲿ´æ´¢ÏµÍ³µÄÇ¿ÒÀÀµÊ¹µÃÔÚ»·¾³²»ÄÇôÎȶ¨µÄÇé¿öÏ£¬¶Ô¿É¿¿ÐÔ»áÔì³ÉÒ»¶¨µÄÓ°Ïì¡£ÔÚ²¢·¢Á¿¹ý¸ßµÄÇé¿öÏ£¬Èç¹û²»ÄܺܺõĿØÖÆËøµÄÁ£¶È£¬ÄÇôʹÓ÷ֲ¼Ê½ËøÒ²ÊDz»Ì«ºÏÊʵġ£×ܵÄÀ´Ëµ£¬·Ö²¼Ê½»·¾³ÏµÄÒµÎñ³¡¾°·×·±¸´ÔÓ£¬Òª½â¾ö»¥³âÐÔºÍÃݵÈÐÔÎÊÌ⻹ÐèÒª½áºÏµ±Ç°ÏµÍ³¼Ü¹¹¡¢ÒµÎñÐèÇóºÍδÀ´Ñݽø×ۺϿ¼ÂÇ¡£Cerberus·Ö²¼Ê½ËøºÍGTISÒ²»á³ÖÐø²»¶ÏµØµü´ú¸üУ¬Ìṩ¸ü¶àµÄÒýÇæÑ¡Ôñ¡¢¸ü¸ßЧ¿É¿¿µÄʵÏÖ·½Ê½¡¢¸ü¼ò½ÝµÄ½ÓÈëÁ÷³Ì£¬ÒÔÆÚÂú×ã¸ü¸´ÔÓµÄʹÓó¡¾°ºÍÒµÎñÐèÇó¡£ |