2013-05-17 3 views
14

क्या किसी ने नए नामस्थान (com.amazonaws.services.dynamodbv2) में परिवर्तन किया है और एडब्ल्यूएस जावा एसडीके 1.4.2 (और बाद में) में डायनेमो डीबी के लिए इंटरफेस किया है? स्थानीय माध्यमिक सूचकांक के रिलीज को the 1.4.2 release notes के अनुसार परिवर्तनों को तोड़ने की जरुरत है।एडब्ल्यूएस जावा एसडीके में डायनेमो डीबी v2 के लिए माइग्रेशन विवरण?

क्या किसी को भी यह पता चला है कि क्या बदल गया है और मौजूदा कोड माइग्रेट करने के लिए क्या करने की आवश्यकता है? मैं यह तय करने की कोशिश कर रहा हूं कि मौजूदा कोड बेस के लिए यह परिवर्तन करने के लिए सबसे अच्छा कब है।

उत्तर

17

नई DynamoDB की dynamodbv2 नाम स्थान निम्नलिखित असंगत परिवर्तन का परिचय (कि में वे बस additive नहीं हैं, और नए नाम स्थान के लिए स्विच करने के लिए कोड परिवर्तन की आवश्यकता):

  • HashKeyElement और RangeKeyElement को मानचित्र < स्ट्रिंग, विशेषता VALue> के साथ प्रतिस्थापित किया गया है। इसमें नामक संरचनाएं शामिल हैं ExclusiveStartKey, LastEvaluatedKey, और कुंजी। इस परिवर्तन के साथ कोड पर मुख्य प्रभाव यह है कि अब GetItem पर कॉल करने के लिए, उदाहरण के लिए, आपके कोड को प्राथमिक कुंजी के विशेषता नामों को जानने की आवश्यकता है, न केवल प्राथमिक कुंजी मान।
  • क्वेरी अब एक KeyCondition प्रकार केमानचित्र < स्ट्रिंग का उपयोग करता है, स्थिति> बजाय अलग HashKeyValue और RangeKeyCondition क्षेत्रों होने का, पूर्ण क्वेरी निर्दिष्ट करने के लिए।
  • CreateTable इनपुट प्राथमिक कुंजी परिभाषाओं से विशेषता प्रकार परिभाषाओं को अलग करता है (और इसे बनाने/अपडेट/हटाएं/प्रतिक्रियाओं का वर्णन करता है)
  • प्रतिक्रियाओं में खपत क्षमता अब एक संख्या की बजाय संरचना है, और इसके लिए पूछा जाना चाहिए अनुरोध में बैच ऑपरेशंस में, यह परिणाम के साथ-साथ अलग उपभोग योग्यता संरचना में वापस आ जाता है।

वांछित होने पर, अपने कोड को नए जावा एपीआई में बढ़ाना संभव है। यदि आप अपने कोड में कार्यक्षमता जोड़ने की योजना बना रहे हैं जो स्थानीय माध्यमिक इंडेक्स से पूछताछ करता है, या स्थानीय माध्यमिक इंडेक्स के साथ टेबल बनाता है, तो आपको अपने कोड के उस हिस्से के लिए नई एपीआई का उपयोग करने की आवश्यकता होगी।

यदि आप नई एपीआई के साथ स्थानीय माध्यमिक इंडेक्स के साथ एक टेबल बनाते हैं, तो आप उस तालिका पर मौजूद सभी मौजूदा संचालन करने के लिए डायनेमोड नेमस्पेस में अपने मौजूदा कोड का उपयोग कर सकते हैं। उदाहरण के तौर पर, डायनेमोड नामस्थान क्लाइंट के साथ PutItem dynamodbv2 क्लाइंट, साथ ही साथ दूसरी तरफ से बनाए गए तालिकाओं के विरुद्ध काम करेगा।

+0

स्पष्ट रूप से निर्दिष्ट करने की आवश्यकता होगी। यह एक अच्छा सारांश है और इसमें कुछ चीजें शामिल हैं जिन्हें मुझे अपने विशिष्ट प्रवासन की आवश्यकता नहीं थी। – mckamey

9

DynamoDB एडब्ल्यूएस जावा 1.4.1 => 1.4.2 (गैर संपूर्ण) प्रवास कदम

ठीक है, मैं गोली थोड़ा और ऐसा किया। मेरा अनुभव यहाँ है।

पहले, बदल DynamoDB नाम स्थान:

  • com.amazonaws.services.dynamodb =>com.amazonaws.services.dynamodbv2

पहली बात तुम नोटिस है वहाँ लापता प्रकार हैं। सबसे बड़ी कुंजी कुंजी चली गई है। अच्छा रिडेंस क्योंकि यह नाम का बहुत सामान्य था। अब इसे मानचित्र के साथ बदल दिया गया है जो समझ में आता है क्योंकि Local Secondary Indexes (एलएसआई) के साथ चाबियाँ बहुत अधिक लचीली हो जाती हैं। दुर्भाग्यवश, सामान्य रूप से नक्शे और जेनिक्स के साथ काम करना जावा में बेकार है (बोनस नीचे देखें)। चला गया withHashKeyElement/withRangeKeyElement के धाराप्रवाह इंटरफेस हैं।

इसके बाद, बहुत सावधानी से लगता है/DynamoDB प्रकार जो सामान्य संग्रह द्वारा प्रतिस्थापित किया गया बदल देते हैं:

  • com.amazonaws.services.dynamodb.model.Key =>Map<String, AttributeValue>
  • com.amazonaws.services.dynamodb.model.BatchResponse =>List<Map<String, AttributeValue>>
  • com.amazonaws.services.dynamodb.model.KeySchema =>List<KeySchemaElement>
  • (शायद अन्य, ये कुछ मैंने सीधे संदर्भित किए थे।)

अगला, तोड़ने वाली हर चीज़ को ढूंढें। यह बहुत मैन्युअल प्रक्रिया है जिसके लिए आपके कोड बेस और एसडीके को अच्छी तरह से जानने की आवश्यकता है। विशेष रूप से, आपको अपनी मुख्य स्कीमा को बहुत अच्छी तरह से जानना चाहिए क्योंकि यह यहां से सभी तार हैं। सौभाग्य से मेरी स्थिति में, पहले दो कार्यों में परिवर्तन के बारे में 90% थे:

  • हर new Map<String, AttributeValue> का पता लगाएं, यह एक संकेत है कि Key पूर्व में वहाँ था।
  • QueryRequest मेगा withKeyConditions(Map<String,Condition>) में withHashKeyValue(AttributeValue)withRangeKeyCondition(Condition) विलय कर इस विधि LSI के लिए कोर परिवर्तन आप हैश/रेंज के अलावा अन्य बातों का उल्लेख कर सकते है। यह स्वीकार करता है कि इंटरफ़ेस की तुलना में अधिक प्रतिबंधित है, लेकिन यह तर्कसंगत है जब आप मानते हैं कि डायनेमोडबी केवल आपको अनुक्रमित विशेषताओं से पूछताछ करने देता है।
  • DynamoDBQueryExpression जेनेरिक बन गया और इसके इंटरफेस को बदल दिया (यकीन नहीं क्यों)।
  • KeySchemaElement नहीं रह गया है AttributeType जरूरत है, लेकिन अब KeyType

अंत में, संकलित करें और प्रतिगमन अपने पूरे ढेर परीक्षण की जरूरत है।

पीएस जबकि मैं यह सब कर रहा था, version 1.4.4.1 अभी मेवेन सेंट्रल को जारी किया गया था।


बोनस

के बाद से नक्शे शिथिल टाइप किये गए वर्गों के जावा की कमी के लिए आम समाधान कर रहे हैं, वे हर जगह हैं। थोड़ा सा सहायक lib वास्तव में इन कम verbosely निर्माण की दिशा में एक लंबा रास्ता तय कर सकते हैं।

public class MakeJavaSuckLess { // TODO: find a shorter class name 
    public static final float MAX_LOAD_FACTOR = 1.0f; 

    /** 
    * Builds a mutable Map from an interlaced sequence of key-value pairs 
    * where keys are strings and values are VType objects 
    * @param pairs 
    * @return 
    */ 
    public static <VType> Map<String, VType> asMap(Object... pairs) { 
     return mergeMaps(null, pairs); 
    } 

    /** 
    * Builds a mutable Map from an interlaced sequence of key-value pairs 
    * where keys are strings and values are VType objects 
    * @param pairs 
    * @return 
    */ 
    public static <VType> Map<String, VType> mergeMaps(Map<String, VType> map, Object... pairs) { 
     final int length = (pairs != null) ? pairs.length/2 : 0; 
     if (map == null) { 
      // max out the load factor since most of these don't change 
      map = new HashMap<String, VType>(length, MAX_LOAD_FACTOR); 
     } 

     for (int i=0; i<length; i++) { 
      String key = asString(pairs[2*i]); 
      @SuppressWarnings("unchecked") 
      VType value = (VType)pairs[2*i+1]; 
      map.put(key, value); 
     } 
     return map; 
    } 
} 

अब आप अपने DynamoDB कुंजी पैदा कर रही है थोड़ा कम बदसूरत: यहाँ मेरी सहायक के कुछ टुकड़े हैं

Map<String, AttributeValue> key = MakeJavaSuckLess.asMap("hashKey", new AttributeValue("hashVal"), "rangeKey", new AttributeValue("rangeVal")); 

Type erasure जावा के जेनरिक में यह फिर से स्थानों में भद्दा बनाता है। आपको कभी-कभी VType:

new GetItemRequest().withKey(MakeJavaSuckLess.<AttributeValue>asMap("hashKey", new AttributeValue("hashVal"), "rangeKey", new AttributeValue("rangeVal"))); 
+3

इस स्टैकओवरफ्लो प्रश्न और आपके मानचित्र निर्माता टिप से प्रेरित, मैंने Google Guava के मानचित्र बिल्डर्स का उपयोग करने के बारे में एक ब्लॉग पोस्ट लिखा और कुछ अन्य युक्तियां [डायनेमोडीबी के जावा एसडीके का उपयोग करते समय कम कोड लिखना] (https://java.awsblog.com/ पोस्ट/Tx2VOZ8V9I67LLD/लेखन-कम-कोड-जब-का उपयोग कर-एडब्ल्यूएस-एसडीके के लिए जावा)। मुझे उम्मीद है यह मदद करेगा! –

+0

इस प्रश्न और उत्तर के बिना, मेरा कोड माइग्रेट करना एक दुःस्वप्न होगा, धन्यवाद। आश्चर्यचकित अमेज़ॅन इस बदलाव में इतना तोड़ दिया। –

संबंधित मुद्दे