±à¼ÍƼö: |
ÕâÆªÎÄÕ½«½âÊͶÎÊôÐÔµÄÔË×÷»úÖÆÒÔ¼°ËüÊÇÈçºÎÌṩһ¸ö¸ßЧµÄ¼üÖµ´æ´¢£¬³ÉΪÆäËüÉϲã¸ß¼¶ÌØÐԵĻùʯ֮һµÄ¡£
±¾ÎÄÀ´×ÔÓÚinfoQ£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
1 ±³¾°Óë¼ò½é
Äܹ»½«Ê¼þ£¨Event£©°´Á÷Ë®Ïߵķ½Ê½×¢Èë¶Î´æ´¢£¨Segment Store£©ÊÇ Pravega ¿Í»§¶ËʵÏÖ¸ßÍÌÍÂÁ¿µÄ¹Ø¼ü¼¼ÊõÖ®Ò»£¬¼´±ãÊÇ´¦ÀíС³ß´çµÄд²Ù×÷Ò²ÊÇÈç´Ë¡£Writer
ÔÚ½ÓÊÕµ½ÊÂÖ®ºóÁ¢¼´½«Æä×·¼Óµ½ÏàÓ¦µÄ¶Î£¨Segment£©ÖУ¬²¢²»»áµÈ´ý֮ǰµÄд²Ù×÷µÃµ½È·ÈÏ¡£ Ϊ±£Ö¤Ë³ÐòºÍ½öÒ»´Î£¨Exactly-Once£©ÓïÒ壬¶Î´æ´¢ÒªÇóËùÓÐÕâЩ׷¼Ó²Ù×÷¶¼ÓÐÌõ¼þµØ»ùÓÚij¸öÒÑ֪״̬£¬¶ø¸Ã״̬¶ÔÓÚÿһ¸ö
Writer ¶¼ÊÇΨһµÄ¡£Õâһ״̬´æ´¢ÔÚÿ¸ö¶ÎµÄ¶ÎÊôÐÔ£¨Segment Attribute£©ÖÐ £¬²¢ÇÒÔÚÿ¸ö¶Î²Ù×÷ÖпÉÒÔ±»Ô×ÓÐԵزéѯ»òÕ߸üС£
Ëæ×Åʱ¼äµÄÍÆÒÆ£¬¶ÎÊôÐÔÒѾÖð½¥ÑÝ»¯²¢Ö§³ÖһϵÁв»Í¬µÄÓÃÀý£¬´Ó¼Ç¼ij¸ö¶Î£¨¿ªÆô Auto-Scaling
ÌØÐÔ£©ÄÚµÄʼþÊýÁ¿µ½´æ´¢¹þÏ£±íµÄË÷Òý¡£±í¶Î£¨Table Segment£¬Ò»ÖÖÓÃÓÚ±£´æ Pravega
ËùÓÐÁ÷¡¢ÊÂÎñºÍ¶ÎµÄÔªÐÅÏ¢µÄ¼üÖµ´æ´¢£©µÄÒýÈëÔòÒªÇóÿ¸ö¶Î¾ßÓÐÎÞ·ì¹ÜÀí³ÉǧÉÏÍòÌõÊôÐÔµÄÄÜÁ¦¡£
ÕâÆªÎÄÕ½«½âÊͶÎÊôÐÔµÄÔË×÷»úÖÆÒÔ¼°ËüÊÇÈçºÎÌṩһ¸ö¸ßЧµÄ¼üÖµ´æ´¢£¬³ÉΪÆäËüÉϲã¸ß¼¶ÌØÐԵĻùʯ֮һµÄ¡£ÎÒÃÇÏÈ´ÓÒ»¸ö¸ÅÀÀ¿ªÊ¼£¬¿´¿´
Pravega Writer ÊÇÈçºÎʹÓöÎÊôÐÔÀ´±ÜÃâÊý¾ÝÖØ¸´ºÍ¶ªÊ§µÄ¡£½Ó×Å£¬ÎÒÃÇ»áÏêϸÃèÊö¶ÎÊôÐÔÊÇÈçºÎÔÚ¶þ¼¶´æ´¢Éϱ»×éÖ¯³É
B+Ê÷£¬²¢Ê¹ÓÃÒ»ÖÖ´´ÐµÄѹËõ·½·¨À´¼õÉÙд·Å´óЧӦµÄ¡£
2 ÀûÓöÎÊôÐÔÀ´±ÜÃâÊý¾ÝÖØ¸´»ò¶ªÊ§
EventStreamWriter ÔÚдÈë¸ü¶àÊý¾Ý֮ǰ£¬±ØÐëÊ×ÏÈÖªµÀËüÔÚ·þÎñÆ÷¶ËÒѾдÈëÊý¾ÝµÄ״̬£¬¼´±ãÊÇÔÚijЩ³£¼ûµÄʧ°Ü³¡¾°ÏÂÒ²ÊÇÈç´Ë¡£ËüÐèÒªÌṩijЩÊýÖµ£¬¶ø·þÎñÆ÷¶Ëÿ´ÎÔÚ³¢ÊÔ½øÐÐÐ޸IJÙ×÷ʱ¶¼¿ÉÒÔÔ×ÓÐԵؼì²éºÍ¸üÐÂÕâЩÊýÖµ¡£
ÔÚÓë·þÎñÆ÷½»»¥µÄ¹ý³ÌÖУ¬´ó¶àÊý¹ÊÕϱíÏÖ³öÀ´µÄÐÎʽ¶¼ÊÇʼþûÓеõ½È·Èϻظ´£¬¶øÔÚÕâÖÖÇé¿öÏ£¬Ïà¹ØµÄ
EventStreamWriter »áʹÓÃÓë֮ǰÏàͬµÄÌõ¼þÖØÊÔд²Ù×÷¡£
Èç¹ûÔÚ֮ǰµÄ³¢ÊÔÖÐʼþÒѾ±»³Ö¾Ã»¯ÁË£¬ÄÇô¶Î´æ´¢»áʹÓà ConditionalAppendFailedException
Òì³£¾Ü¾ø±¾´ÎÖØÊÔ£¬¶ø EventStreamWriter ÔòÏòµ÷ÓÃÕßÈ·Èϱ¾´Îʼþ²¢¼ÌÐø´¦ÀíÏÂÒ»Åúʼþ¡£Ïà·´£¬Èç¹ûʼþ»¹Ã»Óб»³Ö¾Ã»¯£¬Ôò¶Î´æ´¢»áÁ¢¿Ì½øÐг־û¯²¢Ïò
Writer ·¢ËÍÈ·ÈÏ¡£ÕâÖÖ´íÎóÖØÊÔºÍÓÐÌõ¼þʧ°ÜµÄ×éºÏÓÐÖúÓÚ±ÜÃâÊý¾Ý¶ªÊ§£¨Ê¼þδ±»³Ö¾Ã»¯£©ºÍÖØ¸´£¨Ê¼þ±»³Ö¾Ã»¯ÁË£¬µ«È´Ã»Óб»È·ÈÏ£©¡£
ÿ¸ö EventStreamWriter ¶¼ÓÐÒ»¸öΨһµÄ±êʶ·û£¬Writer ID£¬²¢ÇÒÒÀ¾Ýµ±Ç°ÕýÔÚ´¦ÀíµÄʼþµÄ·Óɼü£¨Routing
Key£©£¬¿ÉÒÔͬʱдÈë¶à¸ö¶Î´æ´¢¡£ËüµÄÄÚ²¿×´Ì¬ÓÉÒ»¸ö×Öµä½á¹¹×é³É£¬¶Ôÿ¸ö½»»¥µÄ¶Î¼Ç¼һ¸öʼþ±àºÅ£¨Event
Number£©¡£Ã¿´Î´¦ÀíÒ»¸öÐÂʼþʱ£¬¸ÃÄÚ²¿×´Ì¬¶¼»á·¢Éú¸Ä±ä¡£Ã¿Ò»¸öʼþ¶¼±»×÷Ϊһ¸öÌõ¼þ×·¼Ó£¨Conditional
Append£¬ÒÔµ±Ç°µÄʼþ±àºÅºÍ Writer ID ΪÌõ¼þ£¬ÆÚÍûÔÚ¶ÔÓ¦µÄ¶ÎÉϵõ½Æ¥Å䣩²Ù×÷·¢Íù¶Î´æ´¢¡£¶Î´æ´¢ÉϵÄ×¢ÈëÁ÷Ë®Ïß°´×·¼Ó²Ù×÷µÄ½ÓÊÕ˳ÐòÒÀ´Î´¦ÀíËùÓеÄ×·¼Ó£¬²¢ÇÒÿһ¸öÌõ¼þ×·¼Ó²Ù×÷¶¼»á±»Ô×ÓÐԵؼì²é£¬Ìá½»ºÍ¸üУ¬Òò´Ë±£Ö¤ÁËÊý¾Ý´æ´¢µÄÒ»ÖÂÐÔ¡£
¶Î´æ´¢ÒÔ¶ÎÊôÐÔµÄÐÎʽά»¤Õâһ״̬¡£Í¼ 1 ÓÃÒ»¸öʾÀýչʾÁËÕâÒ»ÔË×÷»úÖÆ¡£

ͼ 1 Writer W1 ºÍ W2 Ïò¶Î A ºÍ¶Î B ×·¼Óʼþ¡£Ã¿¸ö Writer ¶Ôÿһ¸öдÈëµÄ¶Î¶¼ÓÐÒ»ÕÅÓ³Éä±í£¬ÈçÏ£º{¶Î£¬×îºó·¢Ë͵Äʼþ±àºÅ£¬×îºóÈ·ÈϵÄʼþ±àºÅ}¡£¶Î´æ´¢¶Ôÿһ¸öËü¹ÜÀíµÄ¶Î¶¼ÓÐÒ»¸ö´Ó
Writer ID µ½Ê¼þ±àºÅµÄÓ³É䣬¸ÃÓ³ÉäÔÚÿ´Î×·¼Ó²Ù×÷Öж¼»á±»Ô×ÓÐԵؼì²é²¢¸üС£Writer
ÿ´ÎÏò¶Î´æ´¢·¢ËÍʼþʱ¸üÐÂÏàÓ¦µÄ×îºó·¢ËÍʼþµÄ±àºÅ£¬²¢ÔÚÿ´ÎÊÕµ½È·Èϻظ´Ê±¸üÐÂÏàÓ¦µÄ×îºóÈ·ÈÏʼþµÄ±àºÅ¡£
3 ¶ÎÊôÐÔ
ÿ¸ö¶Î¶¼ÓÐÒ»×éÊôÐÔ¼¯ºÏ£¬¿ÉÒÔ±»¶ÀÁ¢Ê¹ÓûòÕßÓ벻ͬµÄ¶Î²Ù×÷×éºÏʹÓá£ÀýÈ磬ÎÒÃÇ¿ÉÒÔÑ¡Ôñ½ö¸üÐÂijЩ¶ÎÊôÐÔ£¬Ò²¿ÉÒÔÑ¡ÔñÔ×ÓÐÔµØÏòij¸ö¶Î×·¼Ó²¢¸üÐÂһЩÊôÐÔ¡£Writer
ID ÊÇÒ»¸ö 128 λµÄ UUID£¬¶øÊ¼þ±àºÅÊÇÒ»¸ö 64 λµÄ³¤ÕûÐÍÊýÖµ£¬Òò´ËÎÒÃǽ«¶ÎÊôÐÔÉè¼ÆÎªÖ§³Ö
16 ×Ö½Ú¼ü£¬8 ×Ö½ÚÖµµÄ¼üÖµ¶Ô¡£
ĿǰÓÐÁ½ÖÖÀàÐ͵ÄÊôÐÔ£ººËÐÄÊôÐÔ£¨Core Attribute£©£¬ËüµÄ ID ÊÇÓ²±àÂëµÄ£¬ÓÃÓÚ±£´æ¶ÎµÄÄÚ²¿×´Ì¬£¨ÀýÈçʼþ×ÜÊý£¬À©Õ¹²ßÂԵȣ©£»À©Õ¹ÊôÐÔ£¨Extended
Attribute£©£¬ËüÊÇ´ÓÍⲿָ¶¨µÄ£¬²¢ÎÞÈκÎÄÚ²¿º¬Òå¡£Á½ÖÖÀàÐ͵ĶÎÊôÐÔ¾ßÓÐÏàͬµÄÓïÒ壬ΨһµÄÇø±ðÊǺËÐÄÊôÐÔÊÇÓÀ¾ÃÄÚ´æ°ó¶¨µÄ£¬¶øÀ©Õ¹ÊôÐÔ¿ÉÒÔ±»»»³ö¡£Writer
ID ¾ÍÊÇʹÓöÎÊôÐÔÓ³É䵽ʼþ±àºÅµÄ¡£
¶ÎÊôÐÔ¿ÉÒÔʹÓÃÈç϶¯´ÊÔÓï½øÐиüУº
Ìæ»»£ºÄ³¸öÊôÐÔÖµ±»ÉèÖÃΪ»ò¸üÐÂΪһ¸öÐÂÖµ¡£
Èç¹û´óÓÚÔòÌæ»»£¨Replace-If-Greater£©£ºÄ³¸öÊôÐÔÖµ±»¸üÐÂΪһ¸öÐÂÖµ v£¬½öµ±´æÔÚÒ»¸öµ±Ç°Öµ
v¡¯²¢ÇÒ v>v¡¯¡£
Èç¹ûµÈÓÚÔòÌæ»»£¨Replace-If-Equal£©£ºÄ³¸öÊôÐÔÖµ±»¸üÐÂΪһ¸öÐÂÖµ v£¬½öµ±µ±Ç°ÖµÓë
v¡¯£¨Óɵ÷ÓÃÕßÌṩ£©Æ¥Åä¡£ÕâÊǾµäµÄ CAS£¨Compare-And-Set£©²Ù×÷£¬¿ÉÒÔÓÃÀ´±£Ö¤ÊôÐÔÖµÔÚ±¾´Î¸üÐÂ֮ǰδ±»²¢·¢ÉèÖá£
ÀÛ¼Ó£ºÄ³¸öÊôÐÔÖµ±»¸üÐÂΪµ±Ç°Öµ¼ÓÉÏÒ»¸öµ÷ÓÃÕßÌṩµÄÖµ¡£
ÒÔÏÂÊÇÒ»¸ö´Ó Pravega µÄ¶Î´æ´¢Ô´ÂëÖнØÈ¡µÄʾÀý£¬Õ¹Ê¾ÁËÈçºÎʹÓöÎÊôÐÔ£º
private CompletableFuture<Void>
storeAppend(Append append) {
ArrayList<AttributeUpdate> attributes =
new ArrayList<>();
// Atomically check-and-update the Writer Position
while
// performing this append.
attributes.add (new AttributeUpdate(
append.getWriterId(), // Attribute Key.
AttributeUpdateType.ReplaceIfEquals, // Compare-and-set.
append.getEventNumber(), // Value to set.
append.getLastEventNumber())); // Value to compare.
// Atomically increase the number of events
stored with this append.
attributes.add(new AttributeUpdate(
Attributes.EVENT_COUNT, // Core Attribute.
AttributeUpdateType.Accumulate, // Add to existing
value.
append.getEventCount())); // Value to add.
// Perform the append. Pass the append payload
and the attributes,
// which tells the Segment Store to apply them
atomically.
return store.append(append.getSegment(), append.getData(),
attributes);
}
|
ÔÚÕâ¶ÎÔ´ÂëÖУ¬Ã¿´Î×·¼Ó²Ù×÷Éæ¼°µ½Á½¸ö¶ÎÊôÐÔ£º½« Writer µÄʼþ±àºÅÌõ¼þ¸üÐÂÖÁÒ»¸öÐÂÖµ£¬²¢ÇÒ¸üжÎÖÐËù´æ´¢µÄʼþ×ÜÊý¡£¶Î´æ´¢µÄ×¢ÈëÁ÷Ë®Ïß×Ô¶¯ÔÚ±¾´Î×·¼Ó²Ù×÷Éæ¼°µÄ¶Î£¨append.getSegment()£©ÉϽøÐÐÈçϲÙ×÷£º
Ñé֤ʼþ±àºÅÊôÐÔÖµÖµÓë append.getLastEventNumber()Æ¥Åä¡£
¸üÐÂʼþ±àºÅÊôÐÔÖµÖÁ append.getEventNumber()¡£
¸üРAttributes.EVENT_COUNT ÖÁÏÈǰֵ¼ÓÉÏ append.getEventCount()¡£
½« append.getData()×÷Ϊһ¶ÎÁ¬Ðø×Ö½ÚÐòÁÐ×·¼Óµ½¶Îβ¶Ë¡£
4 ´æ´¢¶ÎÊôÐÔ
¶ÎÊôÐÔÊÇÿ¸ö¶ÎÉϵĶîÍâÔªÐÅÏ¢£¬Ëü¿ÉÒÔ±»¿Í»§¶Ë×ÔÓɵØÉèÖûò¶ÁÈ¡¡£È»¶ø£¬¶ÎÊôÐÔûÓб»ÈκΠAPI ¶ÔÍⱩ¶¡£Èç¹ûÕâÊǶÎÊôÐÔµÄΨһÓÃ;£¬ÄÇôֻҪ°ÑËüÃÇ´æ´¢ÔÚÒ»¸öÓëÖ÷¶ÎÏà¹ØÁªµÄÒ»¸ö¶ÀÁ¢µÄÄÚ²¿¶ÎÉϾÍ×ã¹»ÁË¡£
µ«ÊÇ£¬ÕýÈçÉÏÎÄÌáµ½µÄ£¬¶ÎÊôÐÔͬʱҲÔÚ×¢ÈëÁ÷Ë®ÏßµÄÄÚ²¿¼ÆËãÖб»´óÁ¿Ê¹Óã¬Èç¹ûÔÚÿ´ÎÐèÒªµÄʱºò¶¼ÔÝʱ¹ÒÆðÁ÷Ë®Ïß²¢´Ó´æ´¢ÖмÓÔØÊôÐÔÖµ£¬±ØÈ»»áÔì³ÉÏ൱´óµÄÐÔÄÜËðʧ¡£ÎÒÃÇÐèÒªÒ»ÖÖ·½·¨»º´æÈ«²¿»òÕß²¿·ÖÊôÐÔÔÚijÖÖÄÚ´æÊý¾Ý½á¹¹ÖУ¬Ê¹Æä¿ÉÒÔºÜÈÝÒ׵ر»Á÷Ë®Ïß·ÃÎʺ͸üУ¬µ«Í¬Ê±±ØÐëÓÃÒ»ÖÖ¸ßЧµÄ·½Ê½×îÖÕ½«ÕâЩ¸üг־û¯µ½¶þ¼¶´æ´¢ÖÐÈ¥¡£
Ϊ½â¾öÕâÒ»ÄÑÌ⣬ÎÒÃÇÉè¼Æ ÁËÒ»ÖÖÁ½²ã»º´æ·½°¸£¬×îÖÕ½«ÊôÐÔÖµ±£´æµ½¶þ¼¶´æ´¢µÄÊôÐԶΣ¨Attribute
Segment£©ÉÏ¡£µÚÒ»²ã»º´æÊÇÒ»¸öÖ±½ÓµÄ Java ¹þÏ£±í£¨HashMap ½Ó¿Ú£©£¬ÓÃÓÚ±£´æ×î½üʹÓõÄÊôÐÔ¡£Õâ²ã»º´æÖ±½Ó½øÐмüÖµÓ³É䣬ʹµÃ²éÕҺ͸üвÙ×÷·Ç³£¸ßЧ¡£Ï²㻺´æÒÔÔʼ¸ñʽ½«¶þ¼¶´æ´¢ÉϵÄÊôÐԶβ¿·Ö±£´æÔÚÄÚ´æÖУ¬¾¡¹ÜÕâÒªÇó·´ÐòÁл¯ÒÔ±ã³éÈ¡ÐÅÏ¢£¬µ«¶Ô¸Ã²ã»º´æµÄ·ÃÎÊÒÀÈ»ÏÔÖø¿ìÓÚÖ±½Ó´Ó¶þ¼¶´æ´¢¼ÓÔØ¡£
ϲ㻺´æºÍ¶þ¼¶´æ´¢ÉϵÄÊôÐÔ¶Îһͬ¹¹³ÉÁËËùνµÄÊôÐÔË÷Òý£¨Attribute Index£©£¬Ëü½«¶ÎÊôÐÔ×éÖ¯³ÉÒ»ÖÖÊʺÏÖ»×·¼Ó£¨Append-Only£©´æ´¢½éÖʵÄÊý¾Ý½á¹¹¡£

ͼ 2 ÊôÐÔÁ÷Ë®Ïß¡£ÊôÐÔ±»±£´æÔÚ¶þ¼¶´æ´¢ÉÏ£»Í¨¹ýÊôÐÔË÷Òý·ÃÎÊÕâЩÊôÐÔ£¬ÊôÐÔË÷ÒýÔÚÄÚ´æÖлº´æÁ˲¿·Ö¶þ¼¶´æ´¢µÄÊý¾Ý£¬²¢Í¨¹ý¶ÎÈÝÆ÷£¨Segment
Container£©µÄ×¢ÈëÁ÷Ë®Ïß½øÐиüС£
ÎÒÃÇ×ö³öµÄ¹Ø¼ü¾ö²ßÖ®Ò»±ãÊǾ¡Á¿±ÜÃâÔÚ×¢ÈëÁ÷Ë®ÏßÄÚÖ±½Ó´Ó¶þ¼¶´æ´¢¼ÓÔØÊôÐÔÖµ£¬¶øÊǾ¡¿ÉÄÜÔÚ´¦Àí²Ù×÷֮ǰ¾Í½øÐÐԤȡ¡£Í¼
2 ÖеIJ½Öè 1.1 µ½²½Öè 1.3 չʾÁËÕâÒ»¹¤×÷Á÷³Ì¡£
ÎÒÃǶÔÄÇЩÒѾÔÚÄÚ´æÖеÄÊôÐÔ½øÐÐÔªÊý¾Ý²éѯ£¨²½Öè 1.1£©£¬²¢´ÓÊôÐÔË÷ÒýÀÈ¡ÆäÓàµÄÊôÐÔ£¨²½Öè 1.2£©¡£ÎªÁËÔÚÄÇЩÕë¶ÔÏàͬÊý¾ÝµÄ²¢·¢ÇëÇó¼ä±£Ö¤Ò»ÖÂÐÔ£¬ÎÒÃÇʹÓÃÌõ¼þÊôÐÔ¸üУ¨Conditional
Attribute Update£©£¬Í¨¹ý×¢ÈëÁ÷Ë®ÏßÔڶεÄÔªÊý¾ÝÖмÓÔØÊôÐÔ£ºÈç¹ûijЩÊôÐÔÒѾ±»¼ÓÔØÁË£¬ÔòÎÒÃDz»Ï£ÍûËüÃǵÄÖµ±»Ä³Ð©Ôà״̬¸²¸Ç¡£
ΪÁ˽«ÊôÐÔÖµ³Ö¾Ã»¯µ½¶þ¼¶´æ´¢ÉÏÈ¥£¬ÎÒÃÇʹÓÃÏÖÓеĻù´¡ÉèÊ©¡£Storage Writer ½«½ÏСµÄ¶Î×·¼Ó²Ù×÷¾ÛºÏ³ÉΪ½Ï´óµÄ»º³åÇøÒ»´ÎÐÔдÈë¶þ¼¶´æ´¢£¬Í¬Ê±ËüÒ²Äܹ»½«¶à¸öÊôÐÔ¸üÐÂ×éºÏ³É½Ï´óµÄÅú²Ù×÷£¬Í¨¹ýÊôÐÔË÷Òý³Ö¾Ã»¯µ½¶þ¼¶´æ´¢¡£Õâ´øÀ´ÁËһЩ¶îÍâµÄºÃ´¦£¬ÄÇЩƵ·±¸üеÄÊôÐÔ£¨ÀýÈçʼþÊý£©²»±ØÃ¿´Î¸ü¸Äºó¶¼³Ö¾Ã»¯µ½¶þ¼¶´æ´¢£ºÎÒÃÇ¿ÉÒÔ½«¶à¸ö¸üÐÂ¾ÛºÏÆðÀ´£¨½ö±£Áô×îеÄÖµ£©£¬Èç´Ë±ÜÃâÁËһЩ·Ç±ØÒªµÄ£¬°º¹óµÄ¶þ¼¶´æ´¢Ð´²Ù×÷¡£
5 ¶ÎÊôÐÔË÷Òý
ÎÒÃÇÃæÁÙµÄ×î´óÌôÕ½»òÐí¾ÍÊǸÃÈçºÎ½«´óÁ¿ÊôÐÔ±£´æµ½ Pravega µÄ¶þ¼¶´æ´¢ÉÏ¡£Ê×ÏÈÃ÷È·Ò»µã£¬ÎÒÃÇËù˵µÄ´óÁ¿¾¿¾¹ÊǶà´ó£¿ÏÖʵһµã˵£¬Í¨³£Ò»¸ö¶Î´óÔ¼»áÓÐÉÏÍò¸ö
Writer£¬ÎÒÃÇÐèÒª¿¼ÂDZÈÕâ¸ü´óµÄÊý¾ÝÁ¿Âð£¿
ÎÒÃÇ×î³õ²ÉÓõķ½°¸¶Ôÿ¸ö¶ÎСÓÚ 10 ÍòÌõÊôÐԵij¡¾°½øÐÐÁËÓÅ»¯£¬·½·¨ºÜ¼òµ¥£ºÎÒÃǽ«Ã¿Ò»¸ö¸üУ¨24
×Ö½Ú£©×·¼Óµ½ÊôÐԶΣ¬ÔÚ³ÖÐøÐ´ÈëÁË´óÔ¼¼¸Õ××Ö½ÚµÄÊý¾Ýºó£¬ÔÙ½«ËùÓÐÊý¾ÝѹËõ³ÉÒ»¸öÓÐÐòÊý×鲢ͬÑù½øÐÐ×·¼Ó¡£Í¬Ê±Î¬»¤ÁËÒ»¸öÖ¸Ïò×îºóÒ»´ÎѹËõÊײ¿µÄÖ¸Õ룬ÿ´ÎÐèÒª¶Áȡʱ£¬¾Í´Ó¸ÃÊײ¿Ò»Ö±¶ÁÈ¡µ½¶ÎµÄβ¶Ë¡£Õâ¸ö·½·¨ºÜ¼òµ¥£¬Ã»ÓÐʲô¸´ÔӵIJ¿·Ö£¬Ò²Äܺܺõش¦ÀíÎÒÃǵÄÓÃÀý£¨10
ÍòÌõÊôÐÔÒâζ×Ŷþ¼¶´æ´¢ÉϵĴóÔ¼ 2.5MB µ½ 5MB Êý¾Ý£¬ÍêÈ«¿ÉÒÔÒ»´ÎÐÔ¶ÁÈ¡²¢»º´æ£©¡£

ͼ 3 ×î³õµÄ·½°¸¡£ËùÓеÄÊôÐÔ¸üж¼±»×·¼Óµ½ÊôÐԶΡ£ÎÒÃÇ»á½øÐÐһЩÖÜÆÚÐÔµÄѹËõ²Ù×÷£¬½ö±£Áô×îеÄÊôÐÔÖµ¡£ÊôÐÔ¶ÎͬʱҲ±»´ÓÍ·²¿½Ø¶Ï£¬¶ªÆú¹ýÆÚÊý¾Ý¡£
´Ó³¤Ô¶ÉÏ¿´£¬ÎÒÃÇ»¹·¢ÏÖÁËÓйØÊôÐÔµÄÁíÍâÒ»Ð©ÖØÒªÓÃ;¡£±í¶Î£¬ÔÚ Pravega µÄ 0.5 °æ±¾Öб»ÒýÈ룬ÓÃÓÚ±£´æ
Pravega ËùÓеÄÔªÊý¾Ý£¬²¢¿ª·ÅÒ»¸ö»ùÓÚÆÕͨ¶ÎµÄ¼üÖµ API¡£×÷Ϊһ¸ö¹þÏ£±í£¬Ëü½«Õû¸öË÷Òý¶¼´æ´¢ÔڶεÄÊôÐÔÖУ¬Òò´ËËü±È
EventStreamWriters ÐèÒª¸ü¶àµÄ¶ÎÊôÐÔÖ§³Ö¡£ÎÒÃÇÒâʶµ½ÎÒÃÇÐèÒªÖ§³Öÿ¶ÎǧÍò¼¶±ðµÄÊôÐÔ£¬ÕâÐèÒªÒ»ÖÖÍêÈ«²»Í¬µÄ·½·¨½«Æä±£´æµ½¶þ¼¶´æ´¢ÉÏ¡£ÎÒÃǵĽâ¾ö·½°¸¾ÍÊÇ
B+Ê÷£¬È»¶ø£¬ÎÒÃÇËùÑ¡ÔñµÄʵÏÖÓë´ó¶àÊýµäÐ͵ÄÊý¾Ý¿âϵͳÉÔÓв»Í¬¡£
6 Ö»×·¼Ó´æ´¢É쵀 B+Ê÷
µ±Ð޸IJÙ×÷Ö»ÔÊÐí±»×·¼Óµ½ÎļþµÄβ¶Ëʱ£¬B+Ê÷ͨ³£²»»áÊÇË÷Òý½á¹¹µÄÊ×Ñ¡¡£Ö»×·¼ÓµÄ B+Ê÷±äÌåÒѾÓÐÏÖÓеÄʵÏÖ£¬µ«ËüÃǶ¼ÓÐÒ»¸öÏÔÖøµÄȱµã£ºÐ´·Å´ó£¨Write
Amplification£©¡£ËùÓжԸýṹµÄÐ޸ͼÐèÒª½«´Ó¸ù½Úµãµ½±»¸üÐÂÊý¾Ý½Úµã·¾¶ÉϵÄËùÓнڵãÖØÐÂ×·¼Óµ½ÎļþÉÏ¡£
Ëæ×Åʱ¼äµÄÍÆÒÆ£¬Õâµ¼ÖÂÁ˳¬´óµÄÎļþ³ß´ç£¬ÆäÖаüº¬ÁË´óÁ¿¹ýÆÚÊý¾Ý¡£ÖÜÆÚÐÔµÄÈ«Ë÷ÒýѹËõËÆºõ¿ÉÒÔ½â¾öÕâ¸öÎÊÌ⣬µ«ÕâÒ»·½·¨¶Ô
Pravega ²¢²»ÊÊÓá£ÓÉÓÚÎÒÃǵÄϵͳ±¾ÖÊÉÏÊÇÒ»¸ö·Ö²¼Ê½ÏµÍ³£¬½ÚµãʧЧʱ²»¿É±ÜÃâµÄ£¬ÖîÈçѹËõ²Ù×÷ÕâÀàµÄ·ÇÔ×ÓÐÔ²Ù×÷ºÜÄÑÔÚ²»Ó°Ïì¶Î´æ´¢ÐÔÄܵÄǰÌáÏÂÕýȷʵÏÖ¡£
ÁíÒ»ÖÖ·½·¨¾ÍÊÇʹÓà LSM Ê÷£¨Log-Structured Merge Tree£©£¬µ«ÕâÖÖÊý¾Ý½á¹¹Ò²´óÁ¿Ê¹ÓÃÁËѹËõ²Ù×÷¡£Òò´Ë£¬ÎÒÃÇʹÓÃÁËһЩм¼ÊõºÍÓÅ»¯·½·¨£¬ÈÃÎÒÃÇ¿ÉÒÔ¸ßЧµØ½«¶ÎÊôÐÔ±£´æµ½¶þ¼¶´æ´¢ÉϵÄ
B+Ê÷ÉÏ¡£
ÎÒÃǵļüÖµÓÀÔ¶Êǹ̶¨³¤¶È£¨·Ö±ðΪ 16 ×Ö½ÚºÍ 8 ×Ö½Ú£©£¬ÕâÈÃÎÒÃǵÃÒÔ¼ò»¯ B+Ê÷µÄ½Úµã½á¹¹£¬²¢ÔÊÐíʹÓýϴóµÄ·Ö²æÒò×Ó£¨Branching
Factor£©¡£É趨×î´ó½Úµã´óСΪ 32KB ²¢ÏÞÖÆÃ¿Ìõ¼Ç¼ 32 ×Ö½Ú£¬Ê¹µÃÎÒÃǵķֲæÒò×Ó¿ÉÒÔ³¬¹ý
1000¡£¶ÔÓÚÒ»¸ö´æ´¢³¬¹ý 10 ÒÚÌõ¼Ç¼µÄË÷Òý½á¹¹£¬ÎÒÃÇ×î¶àÖ»ÐèÒª 3 µ½ 4 ´Î¶þ¼¶´æ´¢ÉϵĶÁ²Ù×÷¾Í¿ÉÒÔÍê³Éij¸ö¼üµÄ²éѯ¡£
¾¡¹ÜÎÒÃÇËùÒª²éѯµÄ¼üµÄÉî¶È¿ÉÄÜÓÐÊý²ã£¬µ«ÈκΠB+Ê÷µÄ²Ù×÷¶¼ÐèÒª²éѯ¸ù½Úµã£¬²¢ÇÒÿһ¸ö¶þ²ã½Úµã¶¼ÓдóԼǧ·ÖÖ®Ò»µÄ¸ÅÂʱ»²éѯ¡£½«½Úµã½øÐлº´æ¿ÉÒÔ¼«´ó¼õÉÙ¶Ô¶þ¼¶´æ´¢µÄËæ»ú¶ÁÈ¡£¬ÓÈÆäÊǶÔÓÚÉî¶È½Ï´óµÄ½Úµã¡£¶ÔÓÚ×î´ó½Úµã´óС
32KB ÕâÑùµÄÉèÖã¬Õû¸ö¶þ²ã½ÚµãÖ»Õ¼ÓôóÔ¼ 32MB µÄ»º´æ¿Õ¼ä£¬ÎÒÃÇÍêÈ«¿ÉÒÔ°ÑËüÃÇÈ«²¿¼ÓÔØµ½ÄÚ´æÖС£ÓÉÓÚ·ÃÎÊģʽµÄ²»Í¬£¬»º´æÃüÖÐÂÊÒ²»áÏàÓ¦Óкܴó±ä»¯£¬µ«ÎÒÃǵIJâÊÔÏÔʾ£¬¶ÔÓÚÒ»¸öÒѾԤÈȵÄË÷Òý£¬µ±Ê¹Óûº´æÊ±£¬¶¨Î»Ò»¸ö¼ü½öÐèÒª²»³¬¹ýÒ»´ÎµÄ¶þ¼¶´æ´¢¶Á²Ù×÷¡£
½Ï´óµÄ·Ö²æÒò×ÓÒ²ÄÜ»º½âд·Å´óÎÊÌ⣬µ«²»ÄÜÍêÈ«Ïû³ýËü¡£È»¶ø£¬Ò»¸öºÜ¹Ø¼üµÄÊÂʵÊÇ£¬¾¡¹ÜÊôÐԶοÉÄÜ»áÎÞÏÞÔö³¤£¬µ«»î¶¯Êý¾Ý£¨×îа汾µÄÊý¾Ý£©×ÜÊǼ¯ÖÐÔڶεÄβ¶Ë£¬¶ø¶ÎµÄÊײ¿ÇãÏòÓÚ°üº¬´ó²¿·ÖµÄ¹ýÆÚÊý¾Ý¡£Í¨¹ýʹÓÃÓë
Retention ÏàͬµÄ·½·¨£¬ÎÒÃÇ¿ÉÒԶԶνøÐÐÍ·²¿½Ø¶Ï£¬É¾³ýÄÇЩÒѾ±»½Ø¶ÏµÄÊý¾Ý¿é£¨Chunk£©¡£¶ÎÉϵÄÊý¾Ý¿éÊÇÒ»×éÁ¬ÐøµÄ×Ö½ÚÐòÁУ¬Ã¿Ò»¸öÊý¾Ý¿é¶¼¶ÔÓ¦¶þ¼¶´æ´¢ÉϵÄÒ»¸öÎļþ»òÕß¶ÔÏó¡£Òò´Ë£¬Í¨¹ý¶ÔÊôÐÔ¶ÎʹÓÃÏÖÓеĹö¶¯´æ´¢£¨Rolling
Storage£©ÊÊÅäÆ÷£¬ÎÒÃÇÒѾ·Ç³£½Ó½üÎÒÃÇµÄÆÚÍûÄ¿±êÁË¡£
È»¶ø£¬ÎÒÃÇÖ»ÓÐÔÚÈ·Èϱ»¶ªÆúµÄÊý¾ÝÖв»ÔÙ°üº¬ÈκÎÈÔÔÚʹÓÃµÄ B+Ê÷½Úµã£¨ÄÇЩÔÚ¸üвÙ×÷ºóÒѱ»ÖØÐÂ×·¼ÓµÄ½Úµã£©ºó£¬²ÅÄܽøÐÐÍ·²¿½Ø¶Ï¡£¶ÎµÄÊײ¿Óкܴó¸ÅÂʰüº¬¹ýÆÚÊý¾Ý£¬µ«Å¼¶ûÒ²»á°üº¬Ò»Ð©ÈÔÔÚʹÓõÄ
B+Ê÷½Úµã¡£¾µäµÄѹËõ²Ù×÷ÒѾ¿¼Âǵ½ÕâÖÖÇé¿öÁË£ºÉ¨ÃèË÷ÒýÎļþ£¬ÕÒµ½×îÔçµÄ±»¹ýÆÚÊý¾Ý°üΧµÄ½Úµã£¬Í¨¹ý×·¼ÓµÄ·½Ê½½«ËüÃÇÒÆ¶¯µ½ÎļþµÄβ¶Ë¡£ËäÈ»Õâ²¢²»»á×èÈû½Ø¶Ï£¬µ«Ëü»¹ÊÇÐèҪͬʱ¶Ô´óÁ¿¶Îά»¤Ò»¶Î½Ï³¤µÄ·ÇÔ×ÓÐÔµÄѹËõ¹ý³Ì¡£
ÎÒÃDzÉÓÃÁËÁíÒ»ÖÖ±»³ÆÎª½¥½øÊ½Ñ¹Ëõ£¨Progressive Compaction£©µÄ·½·¨¡£Ã¿´ÎÐÞ¸Ä
B+Ê÷£¬ÎÒÃǶ¼»á¶¨Î»ÊôÐÔ¶ÎÉÏÆ«ÒÆ×îСµÄÏà¹Ø½Úµã£¬Í¨¹ý×·¼ÓµÄ·½Ê½½«ÆäÒÆ¶¯µ½¶Îβ¶Ë£¨Í¬Ê±¿ÉÄÜ»¹»áÒÆ¶¯ËüµÄ׿ÏȽڵ㣩¡£¾¡¹ÜÕâ¿´ÆðÀ´ÓеãÏñÎÒÃǰÑд·Å´óÎÊÌâ±äµÃ¸üÔã¸âÁË£¬µ«ÕâȷʵÊÇÒ»¸öÈÃÊôÐÔ¶ÎÎļþ³ß´ç±äСµÄÕÛÖÔ·½°¸¡£¶þ¼¶´æ´¢µÄд²Ù×÷ͨ³£±»ÈÏΪÊǸßÍÌÍÂÁ¿µÄ£¬ËùÒÔÿ´Î¶àд
32KB µ½ 100KB µÄÊý¾Ý²»»áÓжàÉÙ²î±ð¡£¶øÎÒÃÇËùµÃµ½µÄ»Ø±¨¾ÍÊÇ£¬ÎÒÃÇ´ÓÒ»¿ªÊ¼¾Í¿ÉÒÔ¶Ô´óÊý¾Ý¿é½øÐнضϣ¬Òò´ËÄܹ»ÈÃÊôÐԶεĴóСʼÖÕ±£³ÖÔÚºÏÀí·¶Î§ÄÚ¡£
ΪÁ˶¨Î»¾ßÓÐ×îÐ¡Æ«ÒÆµÄ½áµã£¬Ã¿¸ö B+Ê÷½Úµã±£´æÁËÒÔËüΪ¸ùµÄ×ÓÊ÷ÖÐËùÓÐ½ÚµãÆ«ÒÆµÄ×îСֵ¡£ÖªµÀÁËÕâ¸öÖµ£¬ÎÒÃǾͿÉÒÔÑØ×Ÿù½ÚµãµÄ·¾¶£¬¶¨Î»µ½¾ßÓÐ×îÐ¡Æ«ÒÆµÄÄǸö½Úµã¡£
ά»¤Õâ¸öÖµÒ²·Ç³£¼òµ¥£ºÒòΪÿ´Î¸üж¼ÐèÒªÐ޸ĴÓÒ¶½Úµãµ½¸ù½Úµã¼äµÄËùÓнڵ㣬ÎÒÃÇËùÒª×öµÄ¾ÍÊÇÀûÓÃÏÖÓнڵãÄÚ±àÂëµÄÐÅÏ¢ÖØÐÂΪÿ¸ö½Úµã¼ÆËã¸ÃÖµ¡£ÎÒÃDz»ÐèÒª¶îÍâµÄ
IO ²Ù×÷£¬Òò´ËÒ²²»»á¶ÔÐÔÄÜÔì³ÉÓ°Ïì¡£

ͼ 4 Èý²ã B+Ê÷ÒÔ¼°ÊôÐԶεIJ¼¾Ö£¨Óн¥½øÊ½Ñ¹ËõºÍÎÞ½¥½øÊ½Ñ¹Ëõ£©¡£Ë÷ÒýͼÀý£º¼üǰ׺±ê×¢ÔÚ¶¥²¿£»µ×²¿ÊÇ×ÓÒ³Æ«ÒÆ:×îÐ¡Ò³Æ«ÒÆ¡£¸ÃÊ÷´¦ÓÚ×îÖÕ״̬¡£
ÎÒÃÇ¿´Ò»ÏÂÔÚͼ 4 ÖУ¬Ëæ×Å B+Ê÷µÄ´´½¨£¬Îļþ²¼¾ÖÊÇÈçºÎ±ä»¯µÄ¡£
Æðʼ£¬ÎÒÃÇÖ»ÓÐÒ»¿Ãµ¥½ÚµãµÄÊ÷£¬½ö°üº¬½Úµã 6¡£
ÎÞÂÛÓÐÎÞ½¥½øÊ½Ñ¹Ëõ£¬ÎÒÃǶ¼¶Ô½Úµã 6 ½øÐÐ×·¼Ó¡£
½Úµã 6 ·ÖÁÑΪ 6 ºÍ 7£¬½Úµã 3 ×÷Ϊ¸ù½Úµã£¬¶ø½Úµã 6 ºÍ 7 Ϊ×ӽڵ㡣
ÎÞÂÛÓÐÎÞ½¥½øÊ½Ñ¹Ëõ£¬ÎÒÃǶ¼×·¼Ó½Úµã 6£¬7 ºÍ 3¡£Îļþ²¼¾ÖΪ£º6£¬6£¬7£¬3¡£
¶ÔÓÚ½¥½øÊ½Ñ¹Ëõ£¬ÎÒÃÇÌø¹ýÖØÐÂ×·¼Ó½Úµã 6£¬ÒòΪËüÒѾ°üº¬ÔÚ¸üÐÂÖÐÁË¡£
½Úµã 6 ·ÖÁÑΪ 5 ºÍ 6¡£½Úµã 3 µÄ×Ó½ÚµãΪ½Úµã 5£¬6 ºÍ 7¡£
ÎÞÂÛÓÐÎÞ½¥½øÊ½Ñ¹Ëõ£¬ÎÒÃǶ¼×·¼Ó½Úµã 5£¬6 ºÍ 3¡£Îļþ²¼¾ÖΪ£º6£¬6£¬7£¬3£¬5£¬6£¬3¡£
¶ÔÓÚ½¥½øÊ½Ñ¹Ëõ£¬ÎÒÃÇÌø¹ýÖØÐÂ×·¼Ó½Úµã 6£¬ÒòΪËüÒѾ°üº¬ÔÚ¸üÐÂÖÐÁË¡£
½Úµã 5 ·ÖÁÑΪ 4 ºÍ 5£»½Úµã 3 ·ÖÁÑΪ 2 ºÍ 3£»½Úµã 1 ´´½¨Îª¸ù¡£½Úµã 1 µÄ×Ó½ÚµãΪ
2 ºÍ 3£¬½Úµã 2 µÄ×Ó½ÚµãΪ 4 ºÍ 5£¬½Úµã 3 µÄ×Ó½ÚµãΪ 6 ºÍ 7¡£
ÎÞ½¥½øÊ½Ñ¹Ëõ£ºÎÒÃÇ×·¼Ó½Úµã 5£¬4£¬3£¬2 ºÍ 1¡£Îļþ²¼¾ÖΪ£º6£¬6£¬7£¬3£¬5£¬6£¬3£¬5£¬4£¬3£¬2£¬1¡£
Óн¥½øÊ½Ñ¹Ëõ£ºÎÒÃÇ×·¼Ó½Úµã 7£¬È»ºóÊǽڵã 5£¬4£¬3£¬2 ºÍ 1¡£Îļþ²¼¾ÖÊÇ£º6£¬6£¬7£¬3£¬5£¬6£¬3£¬7£¬5£¬4£¬3£¬2£¬1¡£
½Úµã 6 ±»¸üС£B+Ê÷ûÓнṹÐԱ仯¡£
ÎÞÂÛÓÐÎÞ½¥½øÊ½Ñ¹Ëõ£¬ÎÒÃǶ¼ÐèҪ׷¼Ó 6£¬3 ºÍ 1¡£
¶ÔÓÚ½¥½øÊ½Ñ¹Ëõ£¬ÎÒÃÇÌø¹ýÖØÐÂ×·¼Ó½Úµã 6£¬ÒòΪËüÒѾ°üº¬ÔÚ¸üÐÂÖС£
ÎÞ½¥½øÊ½Ñ¹ËõµÄ²¼¾Ö£º6£¬6£¬7£¬3£¬5£¬6£¬3£¬5£¬4£¬3£¬2£¬1£¬6£¬3£¬1¡£
Óн¥½øÊ½Ñ¹ËõµÄ²¼¾Ö£º6£¬6£¬7£¬3£¬5£¬6£¬3£¬7£¬5£¬4£¬3£¬2£¬1£¬6£¬3£¬1¡£
ÔÚÕâ¸öÀý×ÓÖУ¬½¥½øÊ½Ñ¹ËõÔÊÐíÎÒÃÇÔÚλÖà 7£¨ÔÚÎÞѹËõµÄÀý×ÓÖÐΪλÖà 2£©½øÐÐÊôÐԶεĽضϣ¬Òò´Ë°ïÖúÎÒÃÇÊÍÁ˷Ų»ÔÙÐèÒªµÄ´ÅÅ̿ռ䡣
7 ʵ¼ÊÓ¦ÓÃÖеĽ¥½øÊ½Ñ¹Ëõ
ΪÁËÑéÖ¤½¥½øÊ½Ñ¹ËõÔÚÏÖʵ³¡¾°ÖеÄÔË×÷Çé¿ö£¬ÎÒÃÇÉè¼Æ²¢ÔËÐÐÁËһϵÁвâÊÔ¡£Í¨¹ý½«¶à¸ö¸üвÙ×÷×éºÏ³ÉÒ»¸ö´óµÄÅú²Ù×÷£¬ÎÒÃÇ¿ÉÒÔ¼õÉÙд·Å´ó£¬ÒòΪÅú²Ù×÷Ô½´ó£¬B+Ê÷¾ÍÔ½ÉÙÐèÒªÖØÐ´ËüµÄÉϲã½Úµã¡£ÎÒÃÇʹÓò»Í¬µÄ²åÈë/¸üÐÂÅú²Ù×÷´óС£¬²¢¶Ô±ÈÓÐѹËõºÍÎÞѹËõÇé¿öϵÄË÷Òý£¨ÔÚ¶þ¼¶´æ´¢ÉÏ£©´óС¡£ÔÚÕâЩ²âÊÔÖÐʹÓõÄÅú²Ù×÷³ß´ç·´Ó³ÁË
Storage Writer ÈçºÎ¾ÛºÏ¸üвÙ×÷£º½ÏСµÄÅú³ß´çÊÊÓÃÓÚÄÇЩ¾ßÓнÏÉÙ²¢·¢ Writer µÄ¶Î£¬¶ø½Ï´óµÄÅú³ß´çͨ³£±»ÓÃÓÚ±í¶Î¡£
Åú³ß´ç |
Ë÷Òý´óС£¨MB£© |
|
|
ÎÞѹËõ |
½¥½øÊ½Ñ¹Ëõ |
10 |
3,991 |
115 (3%) |
100 |
416 |
97 (23%) |
1,000 |
60 |
54 (89%) |
±í 1 ˳Ðò²åÈë 1,000.000 Ìõ¶ÎÊôÐÔ¡£¶Ô½ÏСµÄÅú³ß´ç£¬½¥½øÊ½Ñ¹ËõµÄЧ¹û×îÏÔÖø£¨´óС¼õÉÙÁË
97%£©£¬¶ø½Ï´óµÄÅú³ß´çÔòЧ¹û²¢²»Ã÷ÏÔ£¨ÓÉÓÚ½ÏСµÄд·Å´ó£©¡£
Åú³ß´ç |
Ë÷Òý´óС£¨MB£© |
|
|
ÎÞѹËõ |
½¥½øÊ½Ñ¹Ëõ |
10 |
32,990 |
72 (0.22%) |
100 |
29,402 |
103 (0.35%) |
1,000 |
17,083 |
91 (0.53%) |
±í 2 ÅúÁ¿¼ÓÔØ 1,000,000 Ìõ¶ÎÊôÐÔ£¬²¢°´Ëæ»ú˳Ðò¸üС£ÎÞÂÛÅú³ß´çÈçºÎ£¬Ð´·Å´óÎÊÌⶼʮ·ÖÑÏÖØ£¬½¥½øÊ½Ñ¹ËõÒ²Òò´ËÈ¡µÃÁËÏÔÖøÐ§¹û£ºË÷Òý´óС±»¼õÉÙÁËÖÁÉÙ
99.5%¡£
8 ×ܽá
ÊôÐÔÔڶεÄÕû¸öÉúÃüÖÜÆÚÖаçÑÝןËÐĽÇÉ«¡£³ýÁË´æ´¢¶Î±¾ÉíµÄÔªÐÅÏ¢Í⣬ËüÃÇ»¹´óÁ¿²ÎÓëµ½¶ÎµÄÐ޸IJÙ×÷ÖÐÈ¥¡£ËüÃDZ»ÓÃÓÚ±£´æ¶ÎÄÚµÄͳ¼ÆÊý¾Ý£¨ÀýÈçʼþ×ÜÊý£©£¬ÔÊÐí
EventStreamWriters ʵÏÖ½öÒ»´ÎÓïÒå¡£ÔÚ´«Í³Êý¾Ý½á¹¹ÉÏʹÓô´Ðµķ½·¨Ê¹µÃ¶Î´æ´¢¿ÉÒÔΪÿ¸ö¶ÎÓÐЧ¹ÜÀí
10 ÒÚÊýÁ¿¼¶µÄ¶ÎÊôÐÔ¡£½¥½øÊ½Ñ¹ËõÔÚ²»Ê¹Óúǫ́ÈÎÎñºÍ²»Ó°ÏìÐÔÄܵÄÇé¿öϼõСÁËд·Å´óЧӦ£¬ÎªÖ»×·¼Ó B+Ê÷¼õСÁË
99.5%µÄ³ß´ç¡£
|