Monday, 5 February 2018

استراتيجية إصدار جافا


كايل ليبر.
بعض الأشياء شعرت الكتابة عن.
مافين فيرسيونينغ ستراتيغي.
لقد أجري الكثير من المناقشات مع المحللين في مؤسستي حول كيفية إصدار البرامج باستخدام مافين و I & [رسقوو]؛ م العثور على هناك سوء فهم مشترك حول ما يعني سنافشوت في الواقع. لقد كنت تبحث عن بلوق جيدة لإرسالها التي تساعد على شرح الإصدار في مافين ولكن للأسف كل شيء أنا & [رسقوو]؛ وجدت فقط يناقش إصدارات الإصدارات وليس كيفية استخدامها كما كنت إعادة تطوير التطبيق. لذلك، قررت أنني سوف تأخذ طعنة في ذلك. أرحب بأي تعليقات ونقد بناء سيساعدني على تحسين هذه الوثيقة، لذا يرجى عدم التردد.
أولا، سنافوت ليست نفس الشيء مثل إصدار ألفا / بيتا / الخ. إنها كلمة رئيسية خاصة تعني أنها أحدث إصدار من شفرتك. وهذا يعني أنه يتغير. إذا كنت سحبت سوماب-1.0-سنافشوت أمس ثم حاولت سحب عليه اليوم فإنه من المرجح أن لا تكون هي نفسها. وهذا يعني أيضا إذا كان لديك مشروع يعتمد على إصدار سنافشوت، سوف تحتاج إلى مافين للتحقق من مستودع بعيد عن التغييرات في كل مرة تقوم بتشغيل بناء.
الشيء التالي لفهم هو ما هو الافراج عنه في مافين. الإفراج لا يعني أن الإصدار جاهز للإنتاج. وهذا يعني أن المطور قد قرر أنه في مرحلة في تطوره أنه يريد أن يكون رمز مغلق حتى لا تضيع. وقد يرغب أيضا في توزيع هذه الشفرة على شخص ما، ربما مكتبة لديه مطور على فريق آخر يحتاج إلى البدء في تطوير التطبيقات الخاصة بهم أو ربما هو التطبيق الذي سيتم تثبيته على بيئة اختبار للاختبار. لذلك هذا يعني أن الافراج عن المافين يمكن أن يكون ألفا، بيتا، وإطلاق سراح المرشح، والتصحيح، والإنتاج، أو أي شيء آخر تريد تصنيفه كما.
منطقي؟ حسنا، ربما المشي من خلال سيناريو لكيفية التعامل مع هذا من شأنه أن يساعدك. أولا يتيح نظرة على استراتيجية الإصدار التي استخدمها:
استراتيجية الإصدار.
بناء الجملة لهذه الاستراتيجية يستند إلى تنسيق في مافين: المرجع الكامل. الاختلافات هي I & [رسقوو]؛ م إعادة تسمية & لدكو؛ نسخة تزايدي & رديقو؛ إلى & لدكو؛ التصحيح & رديقو؛ وكسر المؤهل الاختياري & لدكو؛ & رديقو؛ إن & لدكو؛ تايب & رديقو؛ و & لدكو؛ محاولة & رديقو؛ لمجرد الوضوح.
العلامة & lt؛ & GT الكبرى. - هذا هو رقم يشير إلى تغيير كبير في التطبيق. قد تكون النسخة الرئيسية إعادة كتابة كاملة من النسخة الرئيسية السابقة و / أو كسر التوافق الوراء مع الإصدارات القديمة. العلامة & lt؛ قاصر & GT. - هذا رقم يشير إلى مجموعة صغيرة من التغييرات من الإصدار الثانوي السابق. وعادة ما تتكون النسخة الثانوية من مجموعة من إصلاحات الشوائب والميزات الجديدة ويجب أن تكون دائما متوافقة مع الوراء. العلامة & lt؛ التصحيح وGT. - هذا هو الرقم الذي يشير إلى أن بعض الأخطاء الثابتة التي لا يمكن الانتظار حتى الإصدار الطفيفة المقبل. يجب أن يتضمن إصدار التصحيح إصلاحات الأخطاء فقط وعدم تضمين ميزات جديدة مطلقا. وينبغي أيضا أن تكون دائما متوافقة مع الوراء. إصلاحات الأمان هي مثال على التصحيح نموذجي. [& لوت؛ تايب & غ؛ - & لوت؛ تريبوت & غ؛] - هذا الجزء الأخير اختياري ويستخدم فقط لتحديد أن هذا الإصدار ليس بالضرورة مستقرا. النوع هو كلمة رئيسية ويمكن أن يكون أي شيء ولكن أنا عادة التمسك ألفا، بيتا، و أرسي. المحاولة مجرد رقم للإشارة إلى أي محاولة من هذا النوع هي. على سبيل المثال، بيتا-01، أرسي-02، أرسي-05، إلخ. للحصول على نسخة مستقرة، أترك هذا الجزء، ومع ذلك، لقد رأيت المشاريع الأخرى التي ترغب في استخدام الكلمة من ريليس للإشارة إلى نسخة مستقرة (يمكنك ترك محاولة لأن ذلك لن يكون منطقيا، واستخدام أرسي (إطلاق سراح مرشح) لذلك).
مثال سيناريو.
حتى الآن للسيناريو. اسمحوا لي أن أقول أنا & [رسقوو]؛ م العمل على تطبيق فوبار. مؤسستي تتوقع مني تقديم فوبار الإصدار 1.0 في نهاية الربع. (لاحظ أقول 1.0 وهو ما يعني أنا & [رسقوو]؛ م فقط باستخدام أول رقمين للإشارة إلى الإصدار، وذلك لأن النسخة الرئيسية والثانوية هي حقا الإصدارات الوحيدة أي شخص يهتمون بخلاف فريق التطوير الخاص بك. أيضا، هناك & نبسب؛ الطريق بالنسبة لي أن أعرف ما سيكون الإصدار النهائي ولكن أنا لا أعرف الرئيسية والثانوية سوف تبقى على حالها.) أنا & [رسقوو]؛ م العمل على فريق رشيقة لذلك أنا ذاهب لنشر ما فعلته في نهاية كل سباق إلى بيئة الاختبار بلدي حتى اختبار بلدي يمكن التحقق من صحة كل شيء. لذلك، هنا ما يمكنني القيام به:
وسوف تبدأ مع الإصدار 1.0.0-سنافشوت في بلدي pom. xml في بداية سبرينت # 1. في نهاية سبرينت # 1، وسوف تستخدم مافين-ريليس-بلوجين لإنشاء فوبار-1.0.0-أرسي-01 الافراج عن تطبيق فوبار. سوف البرنامج المساعد تغيير الإصدار من 1.0.0-سنافشوت إلى 1.0.0-أرسي-01، علامة رمز في سم مع فوبار-1.0.0-أرسي-01، ومن ثم بناء أخيرا أن الإفراج عنهم. ثم البرنامج المساعد ثم قم بتحديث الجذع ليكون الإصدار القادم من التطبيق الذي سنترك في 1.0.0-سنافشوت. ثم سوف نشر فوبار-1.0.0-أرسي-01 إلى بيئة الاختبار. وسوف تستمر هذه العملية لسباق السرعة المقبلين حتى نصل إلى مرحلة حيث نحن إلى نقطة حيث نعتقد أننا كاملة.
لذلك دعنا نقول إننا الآن في سبرينت # 5. لقد أصدرنا أربعة إصدارات مرشحة الإصدار من التطبيق، وتحديد الخلل وإضافة ميزات على طول الطريق. الآن نحن نشعر فوبار-1.0.0-أرسي-04 جاهز للاستخدام الإنتاج. الآن أنا تشغيل المافين الافراج عن البرنامج المساعد مرة أخرى لإنشاء فوبار-1.0.0 نسخة من طلبي. مرة أخرى، فإن البرنامج المساعد وضع علامة على الإصدار الحالي من التعليمات البرمجية في سم مع فوبار 1.0.0 ومن ثم بناء هذا الإصدار. فإن البرنامج المساعد ثم تحديث الجذع ليكون الإصدار القادم من التطبيق الذي هذه المرة اخترت أن تكون 1.1.0-سنافشوت.
لاحظ، أنا زيادة النسخة الثانوية وليس النسخة التصحيح. في عالم مثالي، وأود أن يتم ذلك مع الإصدار 1.0 ولكن بالطبع هذا هو عالم مثالي وعلى الأرجح أنا و [رسقوو]؛ ليرة لبنانية لديك التصحيح بلدي الإصدار 1.0.0 في مرحلة ما. منذ لا & رسكو؛ ر نعرف متى سيكون I & [رسقوو]؛ م الذهاب إلى مجرد التحرك مع الحياة والبدء في العمل على الإصدار التالي من التطبيق، 1.1.
بعد بضعة أسابيع لي فريق كا بلدي يبلغني أنه تم العثور على علة في اختبار الافراج التي تحتاج إلى أن تكون ثابتة. ماذا سأفعل الآن؟ لقد انتقلت ولديها 1.1 رمز جديد في الجذع الذي لا يمكن الذهاب إلى الإصدار 1.0. لا تقلق، أتذكر أن البرنامج المساعد الافراج عن العلامات كل من بلدي النشرات بالنسبة لي. لذلك، أنا إنشاء فرع من علامة فوبار-1.0.0 وندعوها فوبار-1.0.X. ثم أنا الخروج من هذا الفرع الجديد وزيادة إصدار التصحيح إلى 1.0.1-سنافشوت. هذا الفرع الجديد هو الآن بلدي الترقيع فرع. وسوف إصلاح علة ذكرت لي من قبل فريق كا واستخدام البرنامج المساعد الافراج عن إنتاج نسخة التصحيح فوبار-1.0.1. ثم مباشرة بعد إنتاج فوبار-1.0.1 وسوف دمج 1.0.1 التغييرات في الجذع بحيث الإصلاح موجود في الإصدار 1.1 (الذي لم يتم الافراج عنه).
ثم أخذ نفسا عميقا والعودة إلى العمل على 1.1. إذا علة أخرى يأتي، ربما حتى بعد أن نخرج إلى الإنتاج، وسوف تستمر للتو العودة إلى بلدي فوبار-1.0.X الترقيع فرع لجعل الإصلاح ودمج التغييرات مرة أخرى في الجذع.
استراتيجية مبسطة.
أنا لا تستخدم دائما الاستراتيجية المذكورة أعلاه. في الواقع، الكثير من الوقت يمكنني استخدام ما أود أن نسمي نسخة مبسطة من هذه الاستراتيجية. في الأساس، هو الشيء نفسه باستثناء إزالة العنصر & لوت؛ تايب & غ؛ - & لوت؛ تريبوت & غ؛ تماما وبدلا من & لوت؛ باتش & غ؛ ، لدي أكثر عام & لوت؛ إنكرمنتالفرزيون & غ؛ (تماما كما هو الحال في كتاب المافين). لذلك يبدو هذا:
لنرجع إلى السيناريو المثال أعلاه ومقارنة الاستراتيجية الكاملة مع هذه الإستراتيجية المبسطة:
كما ترون استراتيجية مبسطة يفقد بعض من شجاعة الاستراتيجية الكاملة التي يمكن أن تكون شيئا جيدا وسيئا. لن يكون واضحا ما إذا كان الإصدار جاهزا للإنتاج أم مجرد مرشح الإصدار. ومع ذلك، فهذا يعني أنه لا يتعين عليك اختبار المرشح الذي تم قبوله مرتين. إذا لاحظت إصدار تسليمها بواسطة سبرينت # 4 هو أيضا إصدار الإنتاج. هناك حاجة إلى إعادة بنائه فقط لإزالة - RC-04.
لفريق أصغر أو فريق لا يفعل حقا القطع الأثرية التي يستهلكها العديد من المجالات الأخرى هذا قد يكون حلا أفضل لأن هناك الكثير أقل الإصدار لإدارة. تحتاج فقط للتأكد من أنك التواصل بوضوح مع فريقك حتى يعرف الجميع ما يجري.
المشاركات الاخيرة.
جيثوب ريبوس.
تحديث الحالة. klieber على جيثب.
كوبيرايت & كوبي؛ 2018 كايل ليبر - الترخيص - بدعم من هوغو و هوغو-أوكتوبريس موضوع.

إستراتيجية إصدارات جافا
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
ويب أبي سيرفيسز أبي.
أقدم أبي خدمات الويب الصغيرة لعملائي التي كنت تخطط للتطور مع مرور الوقت. لذلك أنا بحاجة إلى نوع من الإصدار، ولكن لا أستطيع أن أجد أي معلومات حول كيفية القيام بشيء من هذا القبيل.
هل هناك أفضل الممارسات؟
كيف يمكنني الاستمرار في إضافة وظائف جديدة دون كسر التوافق مع خدمات الويب المستهلكين؟
الإصدار هو موضوع معقد، لذلك أولا، تحتاج إلى تحديد أهدافك بطريقة أكثر وصفي. سيكون من الرائع أن أقول أن لديك واجهة يضمن أنك لن كسر التوافق، ولكن اعتمادا على ما هي وظيفة جديدة، قد لا يكون ذلك ممكنا. لذلك هناك حالات مختلفة ومختلف المفاضلات.
إذا كان هدفك هو توفير وظائف جديدة فقط للمستهلكين الجدد، وجميع المستهلكين هم المستهلكين مباشرة (لا وسطاء، والأطر، وما إلى ذلك)، ثم نهج نقطة النهاية منفصلة هو الخيار الافضل. في كل مرة تقوم فيها بإضافة ميزة التي تنطوي على كسر، وخلق نقطة نهاية جديدة، وإعطائها رقم الإصدار الجديد ومن ثم السماح للمستهلكين يعرفون للتحقق من صحة ذلك والتبديل تكوينات بهم. هذه الاستراتيجية هي محاولة جميلة وحقيقية، ولكن لديها عيوب وضع العبء على المستهلكين للحفاظ على ما يصل إلى التاريخ. أيضا، إذا كان هناك تبعيات بين الخدمات يمكن أن تصبح واجبا لتتبع. يكون الاتجاه الصعودي إذا كسر الكود انها ليست (مباشرة) خطأ الخاص بك.
الاستراتيجية الرئيسية الأخرى هي واجهة قابلة للتوسيع. هناك ثلاثة أنواع مختلفة هنا أنا على بينة من. أولا، هو نوع الواجهة التي تحاول أن تصف بشكل جيد نطاق الخدمة الذي يمكن أن تضيفه كل ميزة ممكنة إلى حد ما نظرا للواجهة القائمة. إذا كان هذا يبدو من الصعب، هو عليه. يمكنك استدعاء هذا واجهة مثالية. يتم وصف كل شيء تماما، ولكن المجال بأكمله هو أيضا وصفها تماما. و "الكمال" هو حقا فقط على الورق على الرغم من.
الصنف الثاني هو النوع الذي يبدو وكأنه واجهة عادية ولكن إضافة نقاط الإرشاد العامة. في وسدل هذا يعني شس: أي، أزواج قيمة الاسم أو شيء مماثل. يمكنك استدعاء هذه الواجهة الأساسية القابلة للتوسيع. ليس من الصعب جدا القيام به، ولكن ليس من دون انها المضاعفات. قد تجعل نقاط التمديد الواجهة أكثر صعوبة في العمل مع بعض الأدوات (شس: أني)، أو تفقد بشكل واضح بعض قدرتك على التحقق من المدخلات والمخرجات (أزواج القيمة الاسمية). كما أنه من السهل جدا لإساءة استخدام تلك النقاط التمديد بطريقة تجعل من الإصدار 3 أو 4 من الصعب جدا للاستخدام.
الصنف الثالث هو النوع الذي يحول الواجهة إلى بايت-ستريم. يمكنك استدعاء هذه الواجهات الله. إنهم لا يخلوون من مبرراتهم، ولكن إذا كنت تستخدم واحدا، فقد تحتاج إلى السؤال عن سبب استخدامك لخدمات الويب على الإطلاق. ربما يجب أن تفكر في تكب / إب الخام، أو هتب الأساسي جيت / بوست. ولكن ربما كنت سئمت مع تعقيد وسدلز و شسدز وأنت تريد فقط أن تبدأ من الصفر ولكن كنت مرتبطة خدمات الويب لبعض أسباب البنية التحتية. ندرك أنه بمجرد أن تبدأ هذا المسار، سوف تحتاج إلى طريقة جديدة كاملة لوصف للمستهلكين الخاص بك كيفية / عدم استخدام الخدمة الخاصة بك، وإذا كنت تستخدم شسد لذلك .. حسنا كنت أساسا إلى حيث انت بدأت.
أفضل رهان هو معرفة كل هذه الخيارات ونهج تصميم الخدمة الخاصة بك عن طريق محاولة لأول مرة ل "واجهة مثالية"، ثم التخلي وإضافة نقاط التمدد العامة. في محاولة لتصميم واجهة مثالية سوف يجبرك على تعلم الأشياء التي من شأنها أن تجعل خدمتك أفضل، وليس فقط واجهة الخاص بك، ولكن الامر سيستغرق بعض الوقت، وإذا كنت لا تحد من ذلك الوقت بطريقة أو بأخرى، وسوف يستغرق إلى الأبد.
قليلا قصيرة من واجهة الله الحقيقية، وهناك واجهة المجمع. إذا كان النظام يحتوي على طبقات، فأنت تريد أن تكون الواجهة في طبقات أيضا. عند تغيير الطبقة B، تريد فقط تغيير الطبقة B، وليس كل المثيلات في الطبقة C.
الاستراتيجية الأكثر شيوعا التي رأيتها هي إصدار وسدل بإضافة تعريف الإصدار (عادة يي / مم [/ د]) إلى مساحة اسم الكائنات في ودل، بمعنى:
ويمكن القيام بذلك إما على مستوى نوع (أنواع / مخطط) أو على مستوى وسدل بأكمله - & لوت؛ ديفينيتيونس & غ؛ في 1.1 أو & لوت؛ دسكريبتيون & غ؛ في 2.0.
مؤرخة إلى حد ما، ولكن هذا الرابط من عب ديفيلوبر وركس يوفر الأساس المنطقي لهذا النهج، وتحديدا عندما تحتاج الإصدارات إلى زيادة:
النسخة السابقة التوافق / التغييرات غير كسر:
إزالة أو إعادة تسمية العمليات تغيير المعلمات إلى أسلوب تغيير نوع معقد.
وأضيف عموما سلسلة الإصدار إلى عنوان ورل لخدمة الويب، مما يتيح لي "نقاط النهاية التي تم إصدارها". يمكن أن تكون التعليمات البرمجية التي تنفذ تلك النقاط النهائية مشتركة، إذا كانت الاختلافات تافهة ويمكن التعامل معها من قبل نفس التعليمات البرمجية، أو يمكن استنساخ التعليمات البرمجية، أو في مكان ما بين.
يمكن أن تستخدم نقاط النهاية المختلفة التي تم إصدارها أيضا مخططات شمل المصورة، إذا كان هذا هو ما تحتاج إليه.
واحدة من الاحتمالات هي تصميم جميع عمليات خدمة ويب أن يكون لديك معلمة واحدة فقط من النوع الذي يرث من بعض نوع مجردة الذي يحمل رقم الإصدار. يتم تنفيذ هذا النهج من قبل موقع ئي باي منصة خدمات الويب. شيء مثل ما يلي:
بالإضافة إلى ذلك إذا كنت تعمل عبر هتب قد تحتاج إلى إضافة إصدار كمعلمة هتب جيت إلى عنوان ورل نقطة النهاية خدمة ويب، لذلك عليك أن تكون قادرا على الكشف عن الإصدار المطلوب بسهولة الخادم / الخدمة؟ الإصدار = 1.
أضف "رقم إصدار واجهة برمجة التطبيقات" كمعلمة في كل نمط إستراتيجية واجهة برمجة التطبيقات (أبي) ثم تطبيقه في شفرة خدمة الويب التي يحدد فيها رقم الإصدار الإستراتيجية التي سيتم استخدامها.

إستراتيجية إصدارات جافا
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
استراتيجية مناسبة لقاعدة بيانات الإصدار التحكم.
أنا أقرأ هذا بلوق ولدي سؤال حول 5 المشاركات المكتوبة. من ما أفهم قمت بإنشائه على نص أساسي كبير يتضمن كافة التعدادات سكل دل. بعد القيام بذلك يمكنك تتبع كل تغيير في البرامج النصية منفصلة.
ومع ذلك أنا لا أفهم كيف يمكن أن يكون اسم ملف البرنامج النصي ذات صلة إلى بناء معين من التطبيق الخاص بك؟ ويقول أنه إذا كان المستخدم تقارير علة في 3.1.5.6723 يمكنك إعادة تشغيل البرامج النصية إلى هذا الإصدار. وهل تتبع التغييرات على جدول وما إلى ذلك في ملف خاص أو لديك كافة التغييرات دل في نفس ملف البرنامج النصي ثم يكون وجهات النظر وغيرها في الملفات الخاصة كما يقول؟
أولا وقبل كل شيء، ترقيات دب هي الشر، ولكن تلك المدونة يصف كابوس الكلي.
يمكن للمرء إنشاء مصفوفة الكفاءة مبرمج بناء على نهج الترقية:
المستوى 0: لا ترقيات على الإطلاق. العملاء بالرعب ونقل البيانات يدويا باستخدام أي واجهة المستخدم المقدمة من قبل تطبيق أو حلول إدارة دب دب طرف ثالث (صدقوني، فمن الممكن حقا). المستوى 1: يوجد نص برمجي لترقية تفريغ دب. العملاء يشعرون بالأمان، ولكن سوف إصلاح القضايا الصغيرة ومزعجة جدا لمدة 1-2 سنوات القادمة. يعمل النظام، ولكن لا يسمح بأي تغييرات. المستوى 2: تغيير الجدول. تعطل وحشية، وخاصة في حالة وجود مشكلة أثناء الترقية. مشاكل ضخمة وتكاد لا توجد ضمانات للحصول على نتيجة آمنة 100٪. تتم إدارة تحويل البيانات بواسطة برنامج نصي للعربات التي تجرها الدواب. الزبائن ليسوا سعداء. المستوى 3: مخطط أقل تصميم: ساعة واحدة التوقف عن العمل للسماح البرامج النصية عربات التي تجرها الدواب لترجمة التكوين في دب (هذه الخطوة قد تلف دب في كثير من الحالات). دعم الرجال لديهم كل احتياطيات القهوة استنفدت تماما. المستوى 4: ترقيات شفافة كسول: صفر التوقف، ولكن لا يزال بعض القضايا ممكنة. الزبائن سعداء تقريبا، ولكن لا تزال تذكر الخبرة السابقة. المستوى 5: بنية مثالية، لا حاجة إلى ترقية صريحة. مجموع السعادة. الزبائن لا يعرفون ما هو ترقية الإجراء. المطورين إنتاجية وهادئة.
وسوف أصف جميع المسائل التقنية، ولكن قبل أن اسمحوا لي أن أذكر ما يلي (يرجى أن يغفر لي إجابة طويلة جدا):
في الوقت الحاضر دورات التنمية مضغوط جدا و دبس كبيرة تقريبا أي ميزة قد إدخال تغييرات النظام وكسر التوافق حتى إما لدينا إجراء ترقية بسيطة ومستقرة أو أننا قد تأجيل ميزة قد يتم تحديد القضايا من قبل العملاء، لذلك هناك فرصة أن يكون بناء عاجل الساخنة الإصلاح مع بعض الخطوات الترقية اللازمة عموما، فمن الأفضل بكثير لتجنب أي حواجز بينك وبين العملاء.
المستوى 0 والمستوى 1 كلتا الحالتين واضحة وغبية. يجب على أي شخص تجنب ذلك.
المستوى 2 تغيير ليس ذلك سيئا لجداول صغيرة، ولكن يمكن أن يكون مشكلة واحدة كبيرة. على جداول كبيرة حقا (> 1Gb) فإنه ربما يستغرق عدة ساعات أو حتى أيام ل ألتر تابل لإكمال. وعلاوة على ذلك، فإنه لا يحل سوى مسألة ترقية المخطط، ولكن ماذا عن البيانات المخزنة؟ وأقترح أيضا أن نفكر في تخطيط البيانات المادية لفهم العوائق الفعلية وراء هذا النهج. الإجراء كله يمكن أن تكون غير آمنة، لذلك تأكد من وجود النسخ الاحتياطية.
المستوى 3 يتم حل المشكلة مع ترقية المخطط عن طريق نقل المخطط إلى الطبقة العليا. الحل أقل من المخطط هو محدود إلى حد ما، وذلك أساسا لأنه يعطل السلطة بأكملها وراء نموذج العلائقية. ويمكن اقتراح نهج هجين على حد سواء ترقيات سريعة والقدرة على استخدام الجبر العلائقية. هناك بعض المقالات المثيرة للاهتمام:
يرجى ملاحظة، تعقيد إجراءات الترقية لا يزال هناك، انتقلت للتو إلى مستوى التطبيق. هناك العديد من السيناريوهات ذات الصلة، ولكن أنا ذاهب لوصف نظام هجين واحد كنت أعمل مع لعدة سنوات. يمكنني وصف نموذج البيانات بأنه "الكيانات مع العلاقات". وكانت العلاقات بين الكيانات ممثلة على مستوى قاعدة البيانات، وتم تخزين الكيانات نفسها كنقاط شمل.
كان هذا النظام ناضجا وكان لديه ما يكفي من العملاء. كانت هناك الكثير من طلبات الميزات، لذلك كانت فرق البحث والتطوير وفريق ضمان الجودة مشددة قليلا. تم تنفيذ إجراء الترقية في البداية كجافا مستقل التطبيق قراءة النقط شمل من دب، ورفع مستواه باستخدام أبي دوم وكتابته مرة أخرى إلى دب. يبدو النهج الفعلي واضحا جدا، ولكن هناك العديد من القضايا الخفية وراء:
يمكن أن يكون منطق الترقية عربات التي تجرها الدواب إلى حد ما، لذلك هناك فرصة لكتابة بيانات شمل خطأ زيادة كبيرة وقت التوقف عن العملاء يمكن أن يستغرق بعض الوقت لقراءة تحويل-الكتابة 1-2GBs من شمل جميع الخطوات إجراء الترقية ينبغي أن تكون مغطاة الاختبارات التلقائية (أود أن أقول سي هو مست) يمكن العثور على مواطن الخلل الخفية في يوم أو يومين، لذلك النسخ الاحتياطية ليست مفيدة أي أكثر من ذلك، بسبب إدخال البيانات الجديدة رمز الترقية يمكن أن تصبح فوضوي قليلا خاصة إذا كنت تريد / تحتاج أن يكون ترقيات بين يبني (الشرط العادي لأي فريق رشيقة)
لقد حاولت التخفيف من جميع المخاطر المحتملة عن طريق استخدام تعريف إجراءات الترقية أكثر صرامة، وقواعد التحقق من الصحة والاختبارات واسعة النطاق التي يؤديها نظام سي ضد البيانات واقع الحياة (التي تم جمعها عبر جميع العملاء). فوجئت لرؤية بعض الخطوات فشل بسبب القضايا القديمة يدخل منذ وقت طويل من قبل البرامج النصية الترقية القديمة. وقد وضعت خطوات ترقية منفصلة من أجل إصلاح تلك القضايا المخفية. تم إجراء بعض التحسين أيضا لتقليل وقت الترقية إلى 20-30 دقيقة معقولة. تنفيذ شريط التقدم القائم على وحدة التحكم فعل بقية.
ملاحظة سريعة: أي مستخدم النهائي حريصة على رؤية التقدم لأي عملية طويلة (> 2 دقيقة). من فضلك لا ننسى لتنفيذ مثل "متعة".
تم تخزين نسخة دب مبدئيا في الجدول المنفصل. يرجى عدم استخدام هذا النهج، لأنه من الأفضل بكثير أن يكون الكيانات إصدارها بشكل منفصل وتجنب كامل دب قفل أثناء الترقية.
سيتم عرض إجراء ترقية واحد كمثال (جميع خطوات التحقق والتحقق مخفية خلف & لوت؛ بيلد / & غ؛ و لوت؛ فيرسيون / & غ؛ منطق المعالجة). '-' يعني أقل، '*' - أي بناء.
كل برنامج نصي هو جافا صغير أو تنفيذ رائع (تم استخدام زسلت أيضا). في وقت لاحق تم وضع إجراءات خفض أيضا، ولكن هذا هو قصة مختلفة تماما.
المستوى 4 مخطط البيانات على طبقة التطبيق يسمح للقيام بالكثير من الاشياء المثيرة للاهتمام. على سبيل المثال، من الممكن استبدال شمل مع بروتوبوف. كالمعتاد هناك عدة أسباب للقيام بذلك (هو أبسط وأسرع، الخ). إذا كنت لا تحب بناة مفهوم يمكنك استخدام الادخار بدلا من ذلك.
على أي حال، بروتوبوف يسمح لإنشاء نظام متوافق مع الخلف (من حيث البيانات المخزنة) تقريبا دون صداع. ميزة جيدة، بالمناسبة. وجود نظام متوافق مع الوراء يمكنك بسهولة تنفيذ ترقية كسول وشفافة تماما. يمكن أن يكون عملية خلفية أو الترقية بناء على طلب، الخ الخبر السار هو صفر التوقف، المستخدمين سعداء والقدرة على القيام ترقيات أكثر في كثير من الأحيان. مما يعني أنك يمكن أن تتطور بسرعة، والاستجابة فورا على طلبات العملاء، تكون أكثر نجاحا في كلمات أخرى.
المستوى 5 عذرا، ليس لهذا الوقت. يرجى توخي الحذر مع استراتيجيات الترقية. فمن كوتي سهلة لبيع نظام مع بعض مخطط تعريف وقفل نفسك بها. لا ميزات جديدة - لا الزبائن.
قائمة مرجعية بسيطة ولكنها مفيدة للغاية:
سوف تكون قادرة على حل على الفور مشكلة القادمة من جانب العملاء؟ وسوف يكون من الآمن للعميل لرفع مستوى النظام (ماذا لو كان على الأقل مهمة حرجة)؟ كم من الوقت سيكون مطلوبا لتحديد المشكلة؟ هل هناك أي عملية تحقق تلقائية؟
شكرا لقرائتك.
لن يتم الاحتفاظ بالتغييرات على الجداول والآراء في ملفها الخاص. سيتم إنشاء نص برمجي جديد للتغيير لكل تغيير تجريه. حتى إذا قمت بتغيير الجدول 'X' 5 مرات، سيكون لديك 5 مخطوطات تغيير مختلفة لكل من هذه التغييرات.
عندما تريد إنشاء المخطط كما في إصدار إصدار معين، سوف تحصل على شفرة المصدر المسمى لهذا الإصدار. إنشاء قاعدة بيانات من خط الأساس. ثم قم بتشغيل البرامج النصية التغيير في هذا الإصدار من التعليمات البرمجية، في الترتيب الزمني. مثلا
الآن يتيح القول أنك تريد إعادة إنشاء قاعدة البيانات اعتبارا من الإصدار 1.2:
يمكنك مزامنة التعليمات البرمجية لتسمية version_1.2 تشغيل البرامج النصية في ترتيب baseeline. sql، add_publisher. sql، add_publish_date. sql.
بدلا من ليكيباس، هل يمكن استخدام فلايواي (فلايويدب /) الذي يسمح لك لكتابة الخاصة بك ترقية / خفض البرامج النصية سكل. وهذا يوفر المزيد من المرونة ويعمل أيضا على وجهات النظر والإجراءات المخزنة.
ليكيباس يتطلب منك إجراء تغييرات المخطط باستخدام لغة شمل الخاصة بها، والتي قد تكون محدودة إلى حد ما.
حفظ رقم الإصدار في قاعدة البيانات، وتطبيق البرامج النصية التحديث عند بدء التشغيل، هو جزء مهم من هذه الاستراتيجية.
وإليك كيفية بدء التشغيل:
يتحقق DB_VERSION سجل في قاعدة البيانات، يجد تحديثات> الإصدار الحالي. ربما بواسطة التعليمات البرمجية. يدير كل "تحديث" ساري المفعول أو برنامج نصي أو إجراءات برمجية .. يتم تحديث DB_VERSION بعد كل منها، لذا يمكن إعادة تشغيل الفشل جزئيا من خلال.
العثور على DB_VERSION حاليا = 789؛ رمز متطور، أو سلسلة كبيرة إف طويلة، يجد تحديثات 790 وما فوق. أوبديت # 790، أوبغريد كوستومر & أمب؛ جداول الحساب؛ أوبديت # 791، أوبغريد إمايل تابل؛ تحديث # 792، إعادة ترتيب الجدول النظام؛ نسخة قاعدة البيانات الآن = 792.
هناك عدد قليل من المحاذير. هذا يعمل بشكل جيد بشكل معقول. الناس يدعون أنه ينبغي أن تكون موثوقة 100٪، ولكنها ليست كذلك.
قضايا النصوص غير مكتملة، والاختلافات في أطوال المجال أو الاختلافات في إصدارات الخادم يمكن أحيانا يسبب البرامج النصية / سكل لتمرير على بعض قواعد البيانات، ولكن تفشل على الآخرين.
العثور على البرامج النصية لتشغيل، يمكن أن تكون بسيطة مثل طريقة واحدة كبيرة مع العديد من إف البيانات. أو يمكنك تحميل البرامج النصية عبر الاكتشاف أو البيانات الوصفية، بشكل أكثر أناقة. في بعض الأحيان أنه من المفيد أن تكون قادرة على تضمين التعليمات البرمجية البرمجية، وليس فقط سكل.

إصدار أبي الخاص بك هو الخطأ، وهذا هو السبب قررت أن تفعل ذلك 3 طرق خاطئة مختلفة.
في النهاية، قررت أعدل، كانت الطريقة الأكثر توازنا هو شخ الجميع قبالة على قدم المساواة. بالطبع أنا & # x2019؛ م يتحدث عن إصدار أبي وليس منذ كبيرة & # x201C؛ علامات التبويب مقابل المساحات & # x201D؛ النقاش رأيت الكثير من المعتقدات القوية في مخيمات مختلفة تماما.
كان هذا على ما يرام. عندما بنيت هل أنا بوند؟ (هيب) في أواخر نوفمبر، كان المقصود أن تكون خدمة بسيطة وسريعة أن بعض الناس سوف تستخدم. وأعتقد أنه من العادل أن نقول إن النقطتين الأوليين قد تحققت، ولكن ليست الأخيرة. لم يكن & # x2019؛ t & # x201C؛ عدد قليل & # x201D؛، في الواقع بنهاية الأسبوع الأول كان أكثر من غوغل أناليتيكش يمكن التعامل معها. النقطة هي أنه يمكنك & # x2019؛ t التنبؤ دائما المستقبل عند كتابة أبي الخاص بك، وفي مرحلة ما قد تحتاج إلى تغيير شيء أن الناس بالفعل تعتمد على.
ولكن هنا & # x2019؛ s المشكلة & # x2018؛ في كل مرة تبدأ فيها الحديث عن أي شيء يتعلق بواجهات برمجة التطبيقات عبر هتب، يحدث ذلك:
كل الطريقة التي تقوم بدورها هناك فلسفية مختلفة تأخذ على & # x201C؛ الطريق الصحيح & # x201d؛ والكثير من الوراء وإلى الأمام على ريست، ما هو ريستفول، ما هو ليس وإذا كان الأمر كذلك. دعنا نتحدث عن تغييرات واجهة برمجة التطبيقات، والتأثير على إصدار الإصدارات، ولماذا يوجد الكثير من الأفكار المتباينة حول كيفية القيام بذلك، وفي النهاية، لماذا لا يكون أي من المتبرع مهما بنفس القدر من الأهمية في إنجاز المهام.
سحب المزيد من البيانات الخرق.
مع الأخذ في الاعتبار أن أبي نفسه يستخدم لميزة البحث على الموقع، والآن أيضا من قبل أطراف خارجية خلق كل شيء من تطبيقات الهواتف الذكية إلى أدوات اختبار الاختراق، استجابة أعلاه عملت بشكل جيد في البداية، ولكن كان محدودا. على سبيل المثال، هذا الرد لا يعمل أيضا تماما:
لماذا ا؟ لأن & # x201C؛ باتلفيلدرويز & # x201D؛ هو باسكال-كاسد وهو أمر رائع لمطابقته مع الطبقات كس مرمزة (على الرغم من أنه ربما ليس نهجا جيدا على المدى الطويل) ولها & # x201C؛ مستقرة & # x201D؛ اسمه للإشارة إلى (لقد فشلت & # x2019؛ تغييره، حتى لو كان هناك & # x2019؛ s خرق الثاني)، ولكن هذا & # x2019؛ s غير مناسبة للعرض كعنوان. كل هذا يأتي من أزور الجدول التخزين وأنا ثم انتقل إلى سكل أزور لسحب البيانات العلائقية التي تصف فعلا الخرق. واحدة من السمات في هذا التخزين العلائقية هو الاسم الذي تراه أعلاه.
ما أردت حقا القيام به هو شيء أشبه بهذا:
احصل عليه؟ إلى النقطة السابقة على اسم الخرق، هذا & # x2019؛ ق لا يزال هناك في السمة اسم ولكن الآن لدينا عنوان كذلك. هذا ما تظهره للأشخاص & # x2018؛ & # x201C؛ باتلفيلد هيروز & # x201D؛ & # x2018؛ ولكن الأهم من ذلك، إذا بوكر هو بوند مرة أخرى أستطيع أن أذكر خرق شيء مثل Gawker2017 وعنوان يمكن أن يكون شيئا ودية على غرار & # x201C؛ قاذف (الجيش السوري هجوم الكتروني) & # x201D؛. وهو يقسم ما هو مستقر ويمكن التنبؤ به من ذلك الذي لا يعني أنه يمكن للأشخاص إنشاء تبعيات مثل الصور أو الأصول الأخرى على السمة نيم.
يجب أن تكون البيانات الأخرى واضحة جدا: تاريخ الإخلال، عندما تمت إضافته إلى النظام، عدد الحسابات التي تم تحديدها، ووصف الخرق (مرة أخرى، قد يتغير هذا إذا كان يجب تعديل النص) و # x201C؛ DataClasses & # x201D؛. واحدة من الأشياء التي كان كثير من الناس قد طلب هو وصف ما تم اختراقه في الخرق لذلك هناك الآن مجموعة كاملة من الصفات من يمكن أن تضاف عن طريق مجموعة على الخرق نفسه. I & # x2019؛ م تظهر بالفعل هذه تحت كل خرق على صفحة المواقع بوند (وهذا هو سبب آخر أنا قد الآن قرص بعض من الأوصاف).
هذا هو تغيير كسر. في حين أن مشاعر أبي هي نفسها & # x2018؛ تقديم اسم حساب، نعود قائمة من الانتهاكات & # x2018؛ لم يعد هناك مجموعة من أسماء الخرق. إذا أنا ببساطة استبدال أبي القديم مع هذا واحد، الاشياء سوف كسر. واجهات برمجة التطبيقات. يجب. تتطور.
تتطور البرامج، يجب أن يتم إصدار واجهات برمجة التطبيقات.
اسمحوا & # x2019؛ ق فقط تكون واضحة وضوح الشمس حول هذا: العالم يتحرك جرا. استمر أبي ل هيب حوالي 2 أشهر، وليس لأنه تم تصميم سيئة ولكن لأن الخدمة أصبحت بعنف، ناجحة بشكل غير متوقع. أنا أحب هذه الأنواع من المشاكل، وذلك ينبغي لك.
الآن كان لي خيار؛ إما أن أستطيع أن أفعل ما كان لي وحرمان الناس من أفضل طريقة، وأنا يمكن أن تضيف إلى الخدمة الحالية بطريقة غير كسر أو أنا يمكن أن تخلق نسخة جديدة (وإن تعريض نفس الكيان بطريقة مختلفة) وبناء انها أفضل طريقة لعنة كنت أعرف كيف. لا بايت لا لزوم لها، على غرار بشكل صحيح (حتى أقرر إصدار جديد هو أكثر صحة) وتمثيل جيد للكيان الذي أنا & # x2019؛ م في نهاية المطاف محاولة للوصول الى المستهلكين & # x2019؛ التطبيقات.
ليس هناك شيء خاطئ في تقديم نسخة جديدة من أبي عندما يكون الشيء الأكثر منطقية القيام به. بكل الوسائل، هل دامنديست للحصول عليه & # x201C؛ الحق & # x201D؛ من اليوم الأول، ولكن فعل ذلك مع توقع أن & # x201C؛ يمين & # x201D؛ هي حالة مؤقتة. هذا هو السبب في أننا بحاجة إلى أن تكون قادرة على الإصدار.
مختلف مخيمات الإصدار.
الحق، فكيف يمكن أن يكون هذا الإصدار الأعمال يكون؟ أعني أنه ينبغي أن يكون ممارسة بسيطة، أليس كذلك؟ والمشكلة هي أنه يحصل على فلسفية جدا، ولكن بدلا من الحصول على تعثر في ذلك الآن، واسمحوا لي أن الخطوط العريضة للمدارس الثلاث المشتركة من الفكر من حيث كيف أنها & # x2019؛ نفذت عمليا:
ورل: يمكنك ببساطة إختراق إصدار واجهة برمجة التطبيقات في عنوان ورل، على سبيل المثال: هاريبينبوند / أبي / v2 / برياكثداكونت / فو رأس طلب مخصص: يمكنك استخدام عنوان ورل نفسه كما كان من قبل ولكن أضف رأسا مثل & # x201C؛ أبي-فيرسيون: 2 & # x201D؛ قبول الرأس: يمكنك تعديل رأس قبول لتحديد الإصدار، على سبيل المثال & # x201C؛ قبول: أبليكاتيون / vnd. haveibeenpwned. v2 + جسون & # x201D؛
كانت هناك العديد من الأشياء المكتوبة على هذا و أنا & # x2019؛ م الذهاب إلى ربط لهم في نهاية المشاركة، ولكن هنا & # x2019؛ ق نسخة مختصرة:
تمتص عناوين ورل لأنها يجب أن تمثل الكيان: إنني أتفق فعلا مع هذا ما أن الكيان I & # x2019؛ استرجاع هو حساب خرق، وليس نسخة من حساب خرق. من الناحية الدلالية، فإنه & # x2019؛ s ليس صحيحا حقا ولكن اللعنة عليه & # x2019؛ ق سهلة الاستخدام! تمتص رؤوس الطلبات المخصصة لأنها ليست طريقة دلالية لوصف المورد: توفر لنا مواصفات هتب وسيلة لطلب الطبيعة التي نمثلها مثل الموارد الممثلة في رأس القبول، ولماذا تتكاثر هذه؟ قبول الرؤوس تمتص لأنه يصعب اختبارها: لم يعد بإمكاني إعطاء عنوان ورل لشخص ما سوى & # x201C؛ هنا، انقر على هذا & # x201D؛، بدلا من ذلك يجب إنشاء الطلب بعناية وتهيئة رأس القبول بشكل مناسب .
تميل الحجج المختلفة لكل نهج ومعارضته إلى الانتقال من & # x201C؛ هذا هو & # x2018؛ يمين & # x2019؛ طريقة للقيام بذلك ولكن هو أقل عملية & # x201D؛ من خلال إلى & # x201C؛ هذه هي أسهل طريقة لإنشاء شيء مستهلك مما يجعله & # x2018؛ يمين & # x2019؛ & # x201D ؛. هناك الكثير من النقاش حول الوسائط الفائقة، والتفاوض على المحتوى، وما هو & # x201C؛ ريست & # x201D؛ وجميع المسائل الأخرى. للأسف هذا غالبا ما يحصل الفلسفية ويفقد البصر ما يجب أن يكون الهدف الحقيقي: بناء البرمجيات التي تعمل ولا سيما لأبي، مما يجعلها قابلة للاستهلاك بسهولة.
و & # x2019؛ ق عن وجود عقد مستقر، غبي!
أكثر أهمية من كل الهتاف والهذيان حول القيام بذلك بهذه الطريقة أو بهذه الطريقة هو إعطاء الناس الاستقرار. إذا كانوا يستثمرون جهدهم كسب جهدهم كتابة التعليمات البرمجية لاستهلاك أبي الخاص بك ثم كنت & # x2019؛ د أفضل لعنة جيدا لا تذهب وكسرها على مزيد من أسفل الخط.
بصراحة، المناقشات حول ما هو & # x201C؛ ريستفول & # x201D؛ مقابل ما ليس كما لو أن المصطلح نفسه سوف تملي نجاحك هو مجرد المكسرات. Turn that discussion into “Here are the practical reasons why this makes sense and this is what might happen if you don’t do it”, and I’m all ears. Problem is, even the voices of reason within the noisy discussions leave doubt as to what really is the best approach and therefore I’ve reached a compromise…
Here are 3 wrong ways to consume the HIBP API you can now choose from.
Ok, now that we’ve clearly established however you do it is wrong, I’d like to give you the choice to choose from any one of the 3 wrong ways. Wait ‘ what?! It’s like this: however I implement the API, it will either be too hard to consume, too academic, too likely to fail at the proxy or too something something. Rather than choose 1 wrong way, I’ve decided to give you all 3 wrong ways and you can choose the one that is the least wrong for you.
Wrong way 2 - custom request header:
Inevitably, someone will tell me that providing 3 wrong ways is the wrong thing to do. Won’t it mean more code kludge to maintain? No, it simply means the underlying Web API implementation is decorated with two attributes:
The first one is simply a routing constraint that implements RouteFactoryAttribute. I pass in the route and pass in the version that can map to that route then the implementation looks for the presence of either an “api-version” header or an accept header matching this pattern:
If the version specified in either of these matches the one specified in the routing constraint then that’s the method that will be invoked. This is a simple adaptation of this sample on CodePlex.
The second attribute decorating the GetV2 method above comes courtesy of Web API 2 and the attribute routing feature. Of course we could always do routing in Web API but it was usually defined globally. Attribute routing like this brings the route definition to the context where it is applied and makes it dead easy to see what controller action is going to be called by what route. It also means that the implementations for all 3 wrong ways of calling the API sit together in one neat location.
So in short, no, this doesn’t create a lot of kludge and is very easy to maintain. Each of the 3 approaches will return exactly the same result and most importantly, they’ll remain stable and won’t change in any breaking way and really, at the end of the day, that’s the most important thing regardless of which option you choose. The entire implementation is now also clearly documented on the API page of the site.
But what if you don’t specify a version?
You know the bit where I said you can’t break what’s already out there? Yeah, so that means that if you do what you do now ‘ not specify a version ‘ then you get what you get now. In other words, no request for a specific version means you get version 1.
I’m quite ok with that regardless of having reached this point by default. I know some people always like to return the latest version if a number isn’t specified, but IMHO that breaks the whole “stable contract” goal; what you get from the API today may be completely different to what you get tomorrow if I revise it. That would suck and it would break things.
You have 3 choices, but my personal preference is…
I have the luxury of controlling both the API and the primary consumer of it being the HIBP website itself. Given I’ve provided 3 options for consuming the API, which one do I myself use?
I’ve gone with the philosophical favourite which is to specify it via the accept header. I don’t think this is right and the others are wrong, rather I think that this makes the most sense for two primary reasons:
I agree the URL should not change: If we concur that the URL represents the resource then unless we’re trying to represent different versions of the resource itself then no, I don’t think the URL should change. The breaches for foo are always the breaches for foo and I don’t think that just because I change the data returned for foo that the location of foo should change. I agree that accept headers describe how you’d like the data: This is a semantic of the HTTP spec and just as the semantics of request verbs make a lot of sense (i. e. are we getting or putting or deleting or posting), so too does the way the client would like the content represented.
By no means does this mean that I think the other two are wrong and frankly, there’s no better way to share the API with someone than to say “Here, click this”, but when I can easily construct the request and manage the headers, I’ve gone with this route.
Actually, come to think of it, I also use the version in the domain route. لماذا ا؟ Just through the process of writing this API I was constantly communicating with people about the ways of querying it (more on that later) and the attributes it returns. Being able to go flick an email and say “Hey, here’s what I’m thinking” and they simply click it and get results is invaluable. This is the point that proponents of the URL versioning approach quite rightly make: you simply cannot do this when you’re dependent on headers.
Oh, and in case you’re checking up on me, at the time of writing I haven’t yet rolled the site over to v2 of the API. Now that the breach data is pulled back in the API when a search occurs it means I have the luxury of not loading all breaches into the source on initial load (that was never going to be sustainable as the data set expands). This’ll save a bunch of outbound traffic and speed things up for people in terms of getting the site loaded, but it also means just a little more work on my end. ترّقب.
In closing.
Clearly I’ve been a little tongue-in-cheek here with regards to everything being wrong but honestly, the more you read on this and the more questions you ask, the more wrong every route seems in one way or another. In fact I know damn well that there are aspects of my implementation that will be referred to as “wrong” (I can think of at least a couple) and naturally I’m bracing for the potential onslaught of feedback to that effect. The thing is though, each of these options works and frankly, for all practical purposes, they work just as well as each other.
If I may leave others considering how to version their APIs with a final thought: Nobody will use your API until you’ve built it. Stop procrastinating. None of these are “bad” in any tangible sense, they’re just different. They are all easily consumable, they all return the same result and none of them are likely to have any real impact on the success of your project.
المراجع.
Stack Overflow: Best practices for API versioning? (great question, great answers, closed as “not constructive”, I assume because “Bill the Lizard” got out on the wrong side of bed that morning) Lexical Scope blog: How are REST APIs versioned? (good comparison of versioning practices across services. albeit now a couple of years old) CodePlex: Routing constraint sample (linked in from Microsoft’s Web API page as an example of versioning APIs by adding a custom header) CodeBetter: Versioning RESTful Services (very pragmatic and a good description of the various ways an API might change) Vinay Sahni’s blog: Best Practices for Designing a Pragmatic RESTful API (he’s arguing for URL versioning for the sake of “browser explorability”) Pivotal Lans: API versioning (good view of the conflicting opinions out there) Web Stack of Love: ASP Web API Versioning with Media Types (good end-to-end walkthrough of creating an app to support versioning by content negotiation)
Hi, I'm Troy Hunt, I write this blog, create courses for Pluralsight and am a Microsoft Regional Director and MVP who travels the world speaking at events and training technology professionals.
Hi, I'm Troy Hunt, I write this blog, create courses for Pluralsight and am a Microsoft Regional Director and MVP who travels the world speaking at events and training technology professionals.
الأحداث القادمة.
I usually run private workshops around these, here's the upcoming public events I'll be at:
Don't have Pluralsight already? How about a 10 day free trial? That'll get you access to thousands of courses amongst which are dozens of my own including:
“The Cloud Never Goes Down”, Azure SLAs and other availability trivia.
Here’s how Bell was hacked – SQL injection blow-by-blow.
Subscribe Now!
Copyright 2017, Troy Hunt.
This work is licensed under a Creative Commons Attribution 4.0 International License. In other words, share generously but provide attribution.
تنصل.
Opinions expressed here are my own and may not reflect those of people I work with, my mates, my wife, the kids etc. Unless I'm quoting someone, they're just my own views.
Published with Ghost.
This site runs entirely on Ghost and is made possible thanks to their kind support. Read more about why I chose to use Ghost.

Web Services Versioning.
by Gabriel Bechara.
المقدمة.
Web services are bound to change and evolve over time. The loose coupling principles of service-oriented architecture (SOA) imply that service providers can release a new version of a shared service without waiting for consumers to adapt, and that service consumers should test and certify on a new shared service version before switching. Consequently, you might need to have multiple versions of a shared service running concurrently and simultaneously accessible by different service consumers. Some service consumers might need to continue using an old version of a service until migration of the consumer code occurs. Therefore, Web services versioning is an important subject that should be considered carefully in all enterprise SOA approaches.
Current standards for Web services have no explicit support for versioning, requiring architects and developers to solve the problem through the application of patterns. This article will:
Identify the types of changes that can occur in services.
By the end of this article, you should have a good understanding of the main aspects that should be dealt with when building your own enterprise Web services versioning strategy.
Types of Changes.
A change in a Web services implementation may affect its consumers depending on a number of factors:
A change in the operation parameters of a Web service. This might involve the addition of new parameters (this will affect the current consumers), or a change in existing parameters, such as a change in an XML document that might be used as a message parameter in a Web service. The changes in an XML document may involve the addition of optional elements or attributes (this might affect the current consumers) or of mandatory elements (this will affect the current consumers).
Therefore, a typology of change in Web services can be created in relation to the impact on the current consumers of those services. One approach is to qualify a change that will not affect the current consumers as a minor release and a change that will affect the current consumers as a major release.
Minor Release.
A minor release can be one of two types. The first is a correction of a bug or a performance enhancement. This type will not affect the Web Services Description Language (WSDL) of the Web service. The second type consists of adding new methods to a Web service, wherein the WSDL is changed with no impact on service consumers. A distinction can be made between these two types when labeling those versions. For example, for the first type you can change the second decimal place of the version number (1.0X), while for the second type you change the first decimal place of the version number (1.Y0).
Major Release.
A major release involves a change that will break backwards compatibility. In this case the consumers must be modified. A release that only affects the functionalities of a Web service, without affecting the WSDL, is also considered a major release. This is because the current consumers cannot invoke the new version without considering the Web service's modified functionalities. Now that we have identified the various types of changes and their impact on current consumers, let's take a look at different patterns for Web services versioning.
The Patterns.
Consumer Binding Pattern.
When a new version of a Web service is released -- whether a major or minor release -- the consumers are notified about the change, and are responsible for changing the code to access the new version. The new WSDL is published -- in a UDDI registry, for example -- and a notification is sent to the consumers so that they can find the new service and establish binding with the new service provider. One practice for using a UDDI registry involves associating a given version of a portType to a unique tModel. One WSDL is associated with one tModel. This tModel should contain a reference to the version number for a major release because two major versions will imply two different WSDLs. The tModel may contain a reference to the minor version if two minor versions need to be accessed at one time. A consumer of that portType/version could do a green-pages UDDI search for services that advertise compliance by associating themselves with the tModel of the corresponding version.
This method may impose changes in the consumers' code, at least in the search performed on the registry for accessing a version (major or minor) of a service, even for minor releases. And what if you need to have two minor versions running at the same time? For instance, you might want to deploy a new minor release on a test site to be used by a limited number of consumers, while maintaining the old version for the rest. The consumers of the service deployed on the test site will need to change the end point of the service even if the WSDL is not modified (because it's a minor version). In this specific case, it may be useful to have a layer of indirection between the consumers and the providers, to drive the migration of different consumers in a graceful way.
Figure 1. Consumer Binding Pattern.
Note: The consumer binding pattern does not imply the use of UDDI; it refers to the fact that the binding decision is made on the consumer side. We'll discuss interesting uses of this pattern in a moment.
Layer of Indirection Pattern.
When a new minor version of a Web service is released, the consumer can transparently migrate to the new release. This ability is provided by the layer of indirection through a routing mechanism that ensures content-based routing or user-based routing (based on the IP of the requester, for instance, or on the principal of the requester when propagating security roles) to call the different versions of a Web service.
The use of a layer of indirection allows two minor releases to coexist without changing the consumers' code, and helps to ensure a graceful migration to a new release.
Figure 2. Layer of Indirection Pattern.
But in the case of a major release, the consumers will need to change their code. And what if, for some organizational reason, we need to migrate to a new major release without changing the current consumers' code, calling the new service with the old client? This might happen if, for example, some regulatory reason implies a change accessible only through the use of the new major release of a service, provided by a business partner external to your organization. This leads to using an adapter to enable the use of a new major release for current consumers until all the consumers' code is modified.
Adapter Pattern.
The adapter pattern consists of adapting the client request and response to be able to consume a new major release of a service. Using this pattern offers a smoother migration, in case the use of a new major version of a service is mandatory for some business, regulatory, or organizational reason.
Figure 3. Adapter Pattern.
Solutions for Applying the Patterns.
The different patterns can be applied in different ways. This can be done in the consumers' code, but that is rarely the case because it can cause coding delays and increase the complexity of the code handling versioning. An alternative is to use a mediation layer for decoupling the consumer from the provider and to apply those patterns in the mediation layer. Using Oracle Service Bus as a mediation layer will provide the functionalities of the Layer of Indirection pattern associated with the Adapter Pattern, relieving the consumers' code from those concerns. انظر الشكل 4.
Figure 4. Applying the patterns using Oracle Service Bus.
Using this approach based on Oracle Service Bus offers these advantages:
A minor release change can be addressed without modifying the consumers, and test sites can be addressed through content-based or user-based routing.
Mediation in Oracle Service Bus is mainly configured using proxies to access business services. In between there are pipelines, consisting of stages, actions, branches, and routing nodes. The message is adapted within those pipelines, routing the requests in the routing nodes. The configuration of the proxies and the business services can be organized with a reference to the version numbers. The proxies in Oracle Service Bus may include in their path a reference to the major release, and the business service may include the major and minor release. For example, for a major v1.XX, we will have one proxy, one or more business services (one per minor release), and one WSDL:
. and for major V2.XX:
Note: Because the proxies and the WSDL are the same for minor releases, the path containing those does not need to include a reference to the minor version.
We have addressed the access to different services through Oracle Service Bus. But there are other issues to deal with, such as the deployment of two different versions of a service provider coming from the same development environment. Those services might have the same Java Platform, Enterprise Edition (Java EE) Web module context path, because they may have been developed using the same development tools. Therefore, unless you provide a build script that adds version reference in the context of the Java EE Web module, you might want to consider deploying different versions of the same service on different targets. (A target is a cluster or a managed server.) See Figure 5.
Figure 5. Deploying service providers on different Targets.
Note: Some frameworks and development tools, including Oracle JDeveloper, automate the versioning of some service providers. That capability has been extended in Oracle JDeveloper 11 Technical Preview 4 to deal with the versioning of Service Component Architecture (SCA) composites (multiple services in one composite).
Presentation services and orchestration services (business process services) will benefit from the transparency of this approach when consuming other services belonging to the business services layer or the data access services layer. But what about consumers of presentation services? A composite portal can consume presentation services using Web Services for Remote Portlets (WSRP) to consume remote portlets. The Layer of Indirection pattern, coupled with the Adapter Pattern using Oracle Service Bus, can also be applied in this case, but we may use a more adapted approach based on the portal capabilities. Portals usually come with administration tools for configuring access to portlets (reusable presentation services). Using users' role-based rules and entitlements to display some part of the composite portal, depending on the user properties, may be more appropriate for the presentation services. This is more of a concern with a composite portal engine than with Oracle Service Bus.
Therefore, presentation services layer versioning is better accommodated using the Consumer Binding pattern. In this context, the pattern is not applied by using a UDDI registry to choose the service. In this case, applying this pattern relies on the entitlements or personalization engine provided by the composite portal. An important aspect of this particular use of this pattern is that the choice of the version is made through configuration, in the portal administration tool. Thus, it will not imply any code modification or maintenance.
The figure below shows how a composite portal can consume portlets through WSRP in different versions of the same application. The selection of the portlet version to be exposed is made in the composite portal engine.
Figure 6. The Consumer Binding Pattern applied to presentation services.
Doing this allows two versions of the same application to run simultaneously, exposing new functionalities only to selected end users based on user profile attributes.
استنتاج.
Web services versioning can be handled in a variety of ways, depending on business constraints and the layer to which the service belongs. In this article we've covered practices that can be applied to a variety of versioning tasks:
Accessing and deploying multiple versions of a service provider at the same time.
Some additional factors should be taken into consideration, including XML Schemas versioning and managing dependencies between services and the XML Schemas used by those services. At the organizational level, this will become very difficult to handle without the proper tools for managing dependencies and for driving the changes properly and holistically.
Gabriel Bechara has worked with Oracle-BEA presales and consulting services since 2003. A 15-year veteran of the software industry, Gabriel has served as an architect and advisor on large projects, providing practical experience and feedback on concepts that can provide a foundation for building new information systems. His interests include methodologies for defining software and enterprise architectures, with a strong focus on business integration and SOA.

No comments:

Post a Comment