لماذا قد تحتاج إلى محاكاة البنية التحتية لخدمات الويب من Amazon؟
بادئ ذي بدء ، إنه يوفر - توفير الوقت للتنمية والتصحيح ، والأمر المهم بنفس القدر - توفير الأموال من ميزانية المشروع. من الواضح أن المضاهاة لن تكون مطابقة بنسبة 100٪ للبيئة الأصلية التي نحاول تقليدها. ولكن لغرض الإسراع في تطوير وأتمتة العملية ، ينبغي أن تكون أوجه التشابه القائمة كافية. كان الشيء الأكثر أهمية الذي حدث عام 2018 مع AWS هو حجب موفري IP لعناوين الشبكات الفرعية AWS في الاتحاد الروسي. وقد أثرت هذه الأقفال على بنيتنا التحتية الموجودة في سحابة الأمازون. إذا كنت تخطط لاستخدام تقنية AWS ووضع المشروع في هذه السحابة ، ثم لتطوير واختبار مضاهاة أكثر من ثمارها.

في المنشور ، سوف أخبرك كيف تمكنا من تحقيق مثل هذه الخدعة من خلال خدمات S3 و SQS و RDS PostgreSQL و Redshift عند نقل مستودع بيانات موجود إلى AWS لسنوات عديدة.
هذا جزء فقط من
اجتماع السنة الماضية على
الخريطة ، والذي يتوافق مع محاور AWS و Java. الجزء الثاني يتعلق بقواعد بيانات PostgreSQL و Redshift والعمود ، وقد يتم نشر نسخته النصية في لوحات الوصل ومقاطع الفيديو والشرائح على
موقع المؤتمر الإلكتروني .
عند تطوير تطبيق AWS أثناء حظر الشبكات الفرعية AWS ، فإن الفريق لم يلاحظها عملياً في العملية اليومية لتطوير وظائف جديدة. عملت الاختبارات أيضا ويمكنك تصحيح التطبيق. وفقط عند محاولة إلقاء نظرة على سجلات التطبيق في عمليات تسجيل الدخول ، كانت المقاييس في SignalFX أو تحليل البيانات في Redshift / PostgreSQL RDS مخيبة للآمال - الخدمات لم تكن متوفرة من خلال شبكة الموفر الروسي. ساعدنا مضاهاة AWS على عدم ملاحظة ذلك وتجنب المزيد من التأخير عند العمل مع سحابة Amazon عبر شبكة VPN.
كل مزود سحابة "تحت الغطاء" لديه الكثير من التنانير ويجب ألا تستسلم للإعلان. عليك أن تفهم لماذا كل هذا ضروري لمزود الخدمة. بطبيعة الحال ، فإن البنية التحتية الحالية للأمازون ومايكروسوفت وجوجل لها مزايا. وعندما يخبرونك أن كل شيء يتم فعله فقط لجعله مناسبًا لك للتطور ، فإنهم على الأرجح يحاولون وضعك على إبرة وإعطاء الجرعة الأولى مجانًا. بحيث في وقت لاحق أنها لا تحصل على البنية التحتية والتكنولوجيا المحددة. لذلك ، سنحاول تجنب تأمين البائع. من الواضح أنه ليس من الممكن دائمًا الاستخلاص التام لقرارات محددة وأعتقد أنه في أغلب الأحيان يكون من الممكن تجريد حوالي 90٪ من المشروع. لكن نسبة الـ 10٪ المتبقية من المشروع ، المرتبطة بمزود التقنيات المهمة للغاية ، هي إما تحسين أداء التطبيق أو الميزات الفريدة التي لا توجد في أي مكان آخر. يجب أن يتذكروا دائمًا مزايا وعيوب التقنيات وأن يحموا أنفسهم قدر المستطاع ، وليس "الجلوس" على واجهة برمجة تطبيقات محددة لمزود البنية التحتية السحابية.
تكتب أمازون عن
معالجة الرسائل على موقعها الإلكتروني. جوهر وتجريد تقنيات تبادل الرسائل هو نفسه في كل مكان ، على الرغم من وجود فروق دقيقة - رسالة تمر عبر قوائم الانتظار أو من خلال الموضوعات. لذلك ، توصي AWS باستخدام Apache ActiveMQ المقدم والمدار لترحيل التطبيقات من وسيط مراسلة حالي وتطبيقات Amazon SQS / SNS الجديدة. هذا مثال على الربط لواجهة برمجة التطبيقات الخاصة بهم ، بدلاً من JMS API الموحد والبروتوكولات AMQP و MMQT و STOMP. من الواضح أن هذا المزود مع الحل الخاص به قد يكون له أداء أعلى ، ويدعم قابلية التوسع ، إلخ. من وجهة نظري ، إذا كنت تستخدم مكتباتهم ، وليس واجهات برمجة التطبيقات الموحدة ، فستكون هناك مشكلات أكثر بكثير.
AWS لديه قاعدة بيانات Redshift. إنها قاعدة بيانات موزعة مع بنية متوازية ضخمة. يمكنك تحميل كمية كبيرة من البيانات الخاصة بك إلى الجداول على مواقع Redshft متعددة في Amazon وإجراء استعلامات تحليلية على مجموعات البيانات الكبيرة. هذا ليس نظام OLTP حيث من المهم بالنسبة لك تنفيذ طلبات صغيرة على عدد صغير من السجلات في كثير من الأحيان مع ضمانات ACID. عند العمل مع Redshift ، من المفترض أنه ليس لديك عدد كبير من الاستعلامات لكل وحدة زمنية ، ولكن يمكنهم قراءة المجاميع على كمية كبيرة جدًا من البيانات. يتم وضع هذا النظام من قبل البائع
لترقية مستودع البيانات
الخاص بك (مستودع) على AWS ووعد لتحميل البيانات بسيط. وهذا ليس صحيحا على الإطلاق.
مقتطف من الوثائق التي
تدعم أنواع Amazon Redshift. إنها مجموعة ضئيلة للغاية ، وإذا كنت بحاجة إلى شيء لتخزين ومعالجة البيانات غير المدرجة هنا ، فسيكون من الصعب عليك العمل. على سبيل المثال GUID.
سؤال من القاعة ، "و JSON؟"
- JSON لا يمكن كتابتها إلا كـ VARCHAR وهناك العديد من الوظائف للعمل مع JSON.
تعليق من الجمهور: "Postgres لديه دعم JSON طبيعي."
- نعم ، لديه دعم لهذا النوع من البيانات والوظائف. لكن
Redshift يعتمد على PostgreSQL 8.0.2. كان هناك مشروع ParAccel ، إذا لم أكن مخطئًا ، فهذه التقنية لعام 2005 هي مفترق من postgres يحتوي على جدولة للطلبات الموزعة استنادًا إلى بنية متوازية هائلة. مرت 5-6 سنوات وتم ترخيص هذا المشروع لمنصة Amazon Web Servces وتسمية Redshift. تمت إزالة شيء من بوستجرس الأصلي ، تمت إضافة الكثير. وأضافوا أنه فيما يتعلق بالمصادقة / التفويض في AWS ، مع الأدوار ، والأمن في أمازون يعمل بشكل جيد. ولكن إذا كنت بحاجة ، على سبيل المثال ، للاتصال من Redshift إلى قاعدة بيانات أخرى باستخدام مصدر البيانات الخارجي ، فلن تجد ذلك. لا توجد وظائف للعمل مع XML ، ووظائف للعمل مع JSON مرتين وإساءة حسابها.
عند تطوير تطبيق ما ، حاول
ألا تعتمد على تطبيقات معينة ، ورمز التطبيق يعتمد فقط على التجريدات. يمكنك إنشاء هذه الواجهات والتجريد بنفسك ، ولكن في هذه الحالة ، هناك العديد من المكتبات الجاهزة - واجهات. التي تستخلص الكود من تطبيقات محددة ، من أطر عمل محددة ، ومن الواضح أنها قد لا تدعم جميع الوظائف ، باعتبارها "قاسمًا مشتركًا" للتقنيات. من الأفضل تطوير برامج تعتمد على التجريدات لتبسيط الاختبار.
لمحاكاة AWS ، سأذكر خيارين. الأول أكثر صدقًا وصحيحًا ، لكنه يعمل ببطء أكثر. والثاني قذر وسريع. سأخبرك بخيار الاختراق - نحن نحاول إنشاء البنية التحتية بأكملها في عملية واحدة - ستعمل الاختبارات وخيار الأنظمة الأساسية بشكل أسرع مع العمل في Windows (حيث لا يكون عامل الإرساء قادرًا دائمًا على جني الأموال منك).
الطريقة الأولى مثالية إذا كنت تعمل على نظام linux / macos وكان لديك عامل
إرساء ، فمن الأفضل استخدام
localstack atlassian . من الملائم استخدام
حاويات الاختبار لدمج localstack في JVM.
ما أوقفني عن استخدام lockalstack في docker في المشروع هو أن التطوير كان تحت نظام Windows ولم يوافق أحد على إصدار alpha من docker عند بدء هذا المشروع ... ومن المحتمل أيضًا أنه لن يتم السماح لهم بتثبيت جهاز افتراضي مع linux و docker في أي شركة جادة حول لأمن المعلومات. أنا لا أتحدث عن العمل في بيئة آمنة في البنوك الاستثمارية وحظر جميع جدران الحماية المرورية تقريبًا.
دعنا نفكر في خيارات كيفية محاكاة التخزين البسيط S3. هذا ليس نظام ملفات أمازون عاديًا ، بل هو مخزن كائن موزع. الذي وضعت فيه البيانات الخاصة بك ك BLOB ، دون إمكانية التعديل وإضافة البيانات. هناك مخازن توزيع كاملة مماثلة من الشركات المصنعة الأخرى. على سبيل المثال ، يسمح لك تخزين العنصر الموزع Ceph بالعمل مع وظيفته باستخدام
بروتوكول S3 REST والعميل الحالي مع الحد الأدنى من التعديل. ولكن هذا هو الحل الثقيل إلى حد ما لتطوير واختبار تطبيقات جافا.
مشروع أسرع وأكثر ملاءمة هو مكتبة جافا
s3proxy . إنها تحاكي بروتوكول S3 REST وترجمته إلى مكالمات API
jcloud المقابلة وتتيح لك استخدام العديد من التطبيقات لقراءة وتخزين البيانات بشكل حقيقي. يمكنه بث المكالمات إلى Google App Engine API ، Microsoft Azure API ، ولكن بالنسبة للاختبارات ، يكون أكثر ملاءمة استخدام التخزين المؤقت jcloud في ذاكرة الوصول العشوائي. من الضروري أيضًا تكوين إصدار بروتوكول المصادقة AWS S3 وتحديد القيم الأساسية والسرية ، وكذلك تكوين نقطة النهاية - المنفذ والواجهة التي سيستمع إليها وكيل S3 هذا. وفقًا لذلك ، يجب توصيل الشفرة التي تستخدم عميل AWS SDK في الاختبارات بنقطة النهاية S3 AWS ، وليس منطقة AWS. مرة أخرى ، تذكر أن s3proxy لا يدعم جميع ميزات S3 API ، ولكن جميع سيناريوهات الاستخدام لدينا تحاكي تمامًا! يتم دعم التحميل المتعدد الأجزاء للملفات الكبيرة بواسطة s3proxy.
خدمة Amazon Simple Queue Service هي خدمة انتظار. هناك
خدمة قائمة انتظار
مرنة يتم كتابتها في scala ويمكن تقديمها إلى التطبيق الخاص بك باستخدام بروتوكول Amazon SQS. لم أستخدمه في المشروع ، لذا سأقدم لك رمز التهيئة ، حيث أثق في المعلومات من مطوريها.
في المشروع ، ذهبت في الاتجاه الآخر ، ويعتمد الرمز على مقتطفات الربيع من jmsTemplate و JmsListener وتعيينات المشروع تحدد برنامج تشغيل JMS لـ SQS com.amazonaws: amazon-sqs-java-messaging-lib. هذا هو ما يتعلق رمز التطبيق الرئيسي.
في الاختبارات ، نقوم بتوصيل خادم Artemis-jms كخادم JMS مضمن للاختبارات ، وفي سياق اختبار Spring ، بدلاً من مصنع اتصال SQS ، نستخدم مصنع اتصال Artemis. Artemis هو الإصدار التالي من Apache ActiveMQ ، وهو برنامج حديث موجه نحو الرسائل الوسيطة - وليس مجرد حل اختبار. ربما سننتقل إلى استخدامه في المستقبل ، وليس فقط في الاختبارات الذاتية. وبالتالي ، باستخدام تجريدات JMS بالاقتران مع Spring ، قمنا بتبسيط كل من كود التطبيق والقدرة على اختباره بسهولة. ما عليك سوى إضافة التبعيات org.springframework.boot: spring-boot-starter-artemis و org.apache.activemq: artemis-jms-server.
في بعض الاختبارات ، يمكن محاكاة PostgreSQL عن طريق استبدالها
بقاعدة H2Database . سيعمل هذا إذا كانت الاختبارات غير مقبولة ولا تستخدم وظائف PG محددة. في الوقت نفسه ، يمكن لـ H2 محاكاة مجموعة فرعية من بروتوكول سلك PostgreSQL دون دعم لأنواع البيانات والوظائف. في مشروعنا ، نستخدم Foreing Data Wrapper ، لذلك لا تعمل هذه الطريقة بالنسبة لنا.
يمكنك تشغيل PostgreSQL الحقيقي.
يقوم postgresql-embedded بتنزيل التوزيع الحقيقي ، أو بالأحرى الأرشفة التي تحتوي على ملفات ثنائية للنظام الأساسي الذي ندير به ، فك ضغطه. في نظام التشغيل linux on tempfs في RAM ، في الإطارات في٪ TEMP٪ ، تبدأ عملية خادم postgresql ، وتكوين إعدادات الخادم ومعلمات قاعدة البيانات. بسبب ميزات توزيع التوزيع ، لا تعمل الإصدارات الأقدم من PG 11 في نظام Linux. بنفسي ، قمت بإنشاء
مكتبة مجمعة تسمح لك بالحصول على التجميعات الثنائية لـ PostgreSQL ، ليس فقط من خادم HTTP ولكن أيضًا من مستودع maven. مما قد يكون مفيدًا جدًا عند العمل في شبكات معزولة والبناء على خادم CI دون الوصول إلى الإنترنت. الراحة الأخرى في العمل مع برنامجي هي شرح مكون CDI ، مما يجعل من السهل استخدام المكون في سياق Spring على سبيل المثال. ظهر تنفيذ واجهة خادم AutoClosable في وقت سابق من المشروع الأصلي. لا داعي للتذكر لإيقاف الخادم ، فسيتوقف عند إغلاق سياق Spring تلقائيًا.
عند بدء التشغيل ، يمكنك إنشاء قاعدة بيانات تستند إلى البرامج النصية ، مع استكمال سياق Spring بالخصائص المناسبة. نحن الآن بصدد إنشاء مخطط قاعدة بيانات باستخدام البرامج النصية
للارتحال لترحيل مخطط قاعدة البيانات ، والذي يتم إطلاقه في كل مرة يتم فيها إنشاء قاعدة البيانات في الاختبارات.
للتحقق من البيانات بعد إجراء الاختبارات ، نستخدم مكتبة spring-test-dbunit. في التعليقات التوضيحية على طرق الاختبار ، نشير باستخدام عمليات التحميل لمقارنة حالة قاعدة البيانات. هذا يلغي الحاجة إلى كتابة التعليمات البرمجية للعمل مع dbunit ، تحتاج فقط إلى إضافة مستمع المكتبة إلى رمز الاختبار. يمكنك تحديد الترتيب الذي يتم به حذف البيانات من الجداول بعد اكتمال طريقة الاختبار ، إذا تمت إعادة استخدام سياق قاعدة البيانات بين الاختبارات. في عام 2019 ، هناك نهج أكثر حداثة يتم تنفيذه في
رايدر قواعد البيانات والذي يعمل مع junit5. يمكنك رؤية مثال للاستخدام ، على سبيل المثال
هنا .
أصعب شيء كان محاكاة الأمازون Redshift. يوجد مشروع
redshift-fake driver ، ويركز المشروع على محاكاة تحميل بيانات الدُفعات في قاعدة البيانات التحليلية من AWS. في jdbc: postgresqlredshift بروتوكول المضاهاة ، يتم تنفيذ أوامر COPY و UNLOAD ، ويتم تفويض جميع الأوامر الأخرى إلى برنامج تشغيل JDBC PostgreSQL العادي.
لذلك ، لن تعمل الاختبارات بالطريقة نفسها كما في Redshift ، وهي عملية التحديث ، والتي تستخدم جدولًا آخر كمصدر للبيانات للتحديث (يختلف بناء الجملة في Redshift و PostgreSQL 9+. كما أنني لاحظت تفسيرًا مختلفًا للاقتباس في سطر أوامر SQL بين قواعد بيانات SQL هذه.
نظرًا لهندسة قاعدة بيانات Redshift الحقيقية ، تكون عمليات إدخال البيانات وتحديثها وحذفها بطيئة إلى حد ما و "باهظة الثمن" من حيث الإدخال / الإخراج. من الممكن إدراج بيانات ذات أداء مقبول فقط في "حزم" كبيرة ويسمح لك الأمر COPY فقط بتنزيل البيانات من نظام ملفات S3 موزع. يدعم هذا الأمر في قاعدة البيانات العديد من تنسيقات البيانات AVRO و CSV و JSON و Parquet و ORC و TXT. ويركز مشروع المحاكي على CSV ، TXT ، JSON.
لذلك ، لمحاكاة Redshift في الاختبارات ، ستحتاج إلى بدء تشغيل قاعدة بيانات PostgreSQL كما هو موضح سابقًا وتشغيل مستودع S3 ، وعند إنشاء اتصال إلى postgres ، ستحتاج فقط إلى إضافة redshift-fake-driver في classpath وتحديد jp.ne.opt.redshiftfake.postgres. FakePostgresqlDriver. بعد ذلك ، يمكنك استخدام flyway نفسه لترحيل مخطط قاعدة البيانات ، و dbunit مألوف بالفعل لمقارنة البيانات بعد إجراء الاختبارات.
أتساءل كم عدد القراء الذين يستخدمون AWS و Redshift في عملهم؟ اكتب التعليقات حول تجربتك.
باستخدام مشاريع مفتوحة المصدر فقط ، تمكن الفريق من تسريع عملية التطوير في بيئة AWS ، وتوفير الأموال من ميزانية المشروع وعدم إيقاف الفريق من العمل عندما تم حظر الشبكات الفرعية لـ AWS بواسطة Roskomnadzor.