قائمة طعام
مجاني
التسجيل
الصفحة الرئيسية  /  الملاحون/ جانب الخادم من التطبيقات كيف يعمل. تطوير تطبيقات الهاتف المحمول: مزامنة الخادم

جانب الخادم للتطبيقات كيف يعمل. تطوير تطبيقات الهاتف المحمول: مزامنة الخادم

يبدأ تطوير جانب الخادم لتطبيق خادم العميل بتصميم البنية. يعتمد الكثير على البنية: من قابلية التطبيق للتوسعة إلى أدائه وسهولة الدعم / الصيانة.

بادئ ذي بدء ، تحتاج إلى تحديد كيفية وضع البيانات على الخادم وكيفية معالجة الطلبات الواردة من العميل. تحتاج أيضًا إلى التفكير في تنظيم التخزين المؤقت لبيانات الخادم.

من الضروري تحديد بروتوكولات تبادل البيانات وتنسيقات نقل البيانات.

API (واجهة برمجة التطبيقات) هي واجهة برمجة التطبيقات. بلغة أكثر قابلية للفهم ، هذه مجموعة من الطلبات إلى الخادم ، والتي يفهمها الأخير ويمكن أن تقدم الإجابة الصحيحة. تحدد واجهة برمجة التطبيقات (API) وظائف منطق جانب الخادم ، بينما تسمح لك واجهة برمجة التطبيقات (API) باستخلاص كيفية تنفيذ هذه الوظيفة بالضبط. بمعنى آخر ، تعد واجهة برمجة التطبيقات جزءًا ضروريًا من البنية التحتية العامة للعميل / الخادم.

قارن JSON و XML. قدم مثالاً على البروتوكولات بناءً على نوع التطبيق.

تعدد

يعد تعدد مؤشرات الترابط أحد الجوانب الرئيسية في البرمجة الحديثة. بمساعدة multithreading ، يمكننا تخصيص العديد من مؤشرات الترابط في أحد التطبيقات التي ستؤدي مهامًا مختلفة في نفس الوقت.

تعد خاصية Multithreading خاصية لمنصة (على سبيل المثال ، نظام تشغيل ، جهاز افتراضي ، وما إلى ذلك) أو تطبيق يمكن أن تتكون العملية التي يتم إنتاجها في نظام التشغيل من عدة مؤشرات ترابط تعمل "بالتوازي" ، أي بدون تحديد محدد الطلب في الوقت المناسب.

جوهر تعدد العمليات هو تعدد المهام على مستوى عملية واحدة قابلة للتنفيذ ، أي ، يتم تنفيذ جميع مؤشرات الترابط في مساحة عنوان العملية. بالإضافة إلى ذلك ، لا تحتوي جميع مؤشرات الترابط في العملية على مساحة عنوان مشتركة فحسب ، بل تحتوي أيضًا على واصفات ملفات شائعة. تحتوي العملية الجارية على مؤشر ترابط واحد (رئيسي) على الأقل.

لا ينبغي الخلط بين تعدد العمليات (كعقيدة برمجة) وبين تعدد المهام أو المعالجة المتعددة ، على الرغم من حقيقة أن أنظمة التشغيل التي تنفذ تعدد المهام تميل إلى تنفيذ تعدد العمليات أيضًا.

تشمل مزايا تعدد مؤشرات الترابط في البرمجة ما يلي:

تبسيط البرنامج في بعض الحالات بسبب استخدام مساحة عنوان مشتركة.

قضاء وقت أقل في إنشاء تيار بالنسبة للعملية.

تحسين أداء العملية من خلال الموازنة بين حسابات المعالج وعمليات الإدخال / الإخراج.

تدفق(ثلاثة) هي وحدة مُدارة من التعليمات البرمجية القابلة للتنفيذ. في بيئة متعددة المهام قائمة على الخيط ، يجب أن تحتوي جميع العمليات الجارية على مؤشر ترابط رئيسي ، ولكن يمكن أن يكون هناك المزيد. هذا يعني أنه يمكن تنفيذ مهام متعددة بشكل غير متزامن في برنامج واحد. على سبيل المثال ، تحرير النص في محرر نصوص أثناء الطباعة ، حيث يتم تنفيذ هاتين المهمتين في سلاسل مختلفة.

في المعالج التقليدي ، يتولى نظام التشغيل التحكم في التدفق. يتم تنفيذ مؤشر ترابط حتى انتهاء مقاطعة الجهاز أو استدعاء النظام أو الوقت المخصص له من قبل نظام التشغيل. بعد ذلك ، يقوم المعالج بالتبديل إلى كود نظام التشغيل ، والذي يحفظ حالة الخيط (سياقه) أو ينتقل إلى حالة مؤشر ترابط آخر ، والذي يتم أيضًا تخصيص وقت للتنفيذ. مع مثل هذه العمليات المتعددة ، يتم إنفاق عدد كبير نسبيًا من دورات المعالج على كود نظام التشغيل الذي يقوم بتبديل السياقات. إذا تم تنفيذ دعم الخيط في الأجهزة ، فسيكون المعالج نفسه قادرًا على التبديل بين الخيوط ، وفي الحالة المثالية ، تنفيذ عدة خيوط في وقت واحد لكل دورة.

- تعدد مؤقت للخيوط (خيط واحد)

- تعدد مؤشرات الترابط في وقت واحد (خيوط متعددة في نفس الوقت)

يتيح تعدد مؤشرات الترابط ، باعتباره نموذجًا واسعًا للبرمجة وتنفيذ التعليمات البرمجية ، تنفيذ خيوط متعددة في عملية واحدة. تشترك سلاسل التنفيذ هذه في موارد العملية ، ولكن يمكن تشغيلها بشكل مستقل. يوفر نموذج البرمجة متعدد مؤشرات الترابط للمطورين تجريدًا مناسبًا للتنفيذ المتوازي. ومع ذلك ، ربما يكون التطبيق الأكثر إثارة للاهتمام للتكنولوجيا هو عندما يتم تطبيقها على عملية واحدة ، مما يسمح بالتنفيذ المتوازي على نظام متعدد المعالجات.

تتيح ميزة البرنامج متعدد مؤشرات الترابط تشغيله بشكل أسرع على أنظمة الكمبيوتر التي تحتوي على معالجات متعددة ، أو معالج به عدة نوى ، أو مجموعة من الآلات - لأن خيوط البرنامج تفسح المجال بشكل طبيعي لتنفيذ عمليات متوازية حقًا. في هذه الحالة ، يحتاج المبرمج إلى توخي الحذر الشديد لتجنب ظروف السباق وغيرها من السلوك غير البديهي. من أجل معالجة البيانات بشكل صحيح ، يجب أن تمر سلاسل التنفيذ بشكل متكرر من خلال إجراء الالتقاء من أجل معالجة البيانات بالترتيب الصحيح. قد تحتاج سلاسل التنفيذ أيضًا إلى كائنات المزامنة (والتي غالبًا ما يتم تنفيذها باستخدام الإشارات) لمنع تعديل البيانات المشتركة أو قراءتها في نفس الوقت أثناء عملية التحديث. يمكن أن يؤدي الاستخدام المتهور لمثل هذه الأوليات إلى طريق مسدود.

استخدام آخر لتعدد مؤشرات الترابط ، يمكن تطبيقه حتى على الأنظمة أحادية المعالج ، هو قدرة التطبيق على الاستجابة للمدخلات. في البرامج ذات الخيوط المفردة ، إذا تم حظر الخيط الرئيسي بواسطة مهمة تشغيل طويلة ، يمكن تجميد التطبيق بأكمله. من خلال نقل هذه المهام التي تستغرق وقتًا طويلاً إلى مؤشر ترابط عامل يعمل بالتوازي مع مؤشر الترابط الرئيسي ، يصبح من الممكن للتطبيقات الاستمرار في الاستجابة لإدخال المستخدم أثناء تشغيل المهام في الخلفية. من ناحية أخرى ، في معظم الحالات ، لا يعد تعدد مؤشرات الترابط هو الطريقة الوحيدة للحفاظ على حساسية البرنامج. يمكن تحقيق نفس الشيء من خلال الإدخال / الإخراج غير المتزامن أو الإشارات على UNIX.

في المجموع ، هناك نوعان من تعدد المهام: على أساس العملياتو على أساس التدفقات... يتلخص الاختلاف بين المهام المتعددة القائمة على العمليات والقائمة على الخيط في ما يلي: يتم تنظيم المهام المتعددة القائمة على العمليات من أجل التنفيذ المتوازي للبرامج ، وتعدد المهام القائم على الخيط هو للتنفيذ المتوازي لأجزاء منفصلة من نفس البرنامج.

في المجموع ، يتم تمييز نوعين من التدفقات:

الخيوط الأمامية أو المقدمة. بشكل افتراضي ، يصبح كل مؤشر ترابط تم إنشاؤه من خلال طريقة Thread.Start () هو مؤشر الترابط الأمامي تلقائيًا. توفر هذه الأنواع من الخيوط حماية التطبيق الحالي من الإنهاء. لن يقوم CLR بإيقاف التطبيق حتى تنتهي كافة مؤشرات الترابط الأمامية.

مواضيع الخلفية يسمى هذا النوع من الخيوط أيضًا سلاسل العمليات الخفية ، ويتم تفسيره بواسطة CLR على أنه مسارات تنفيذ قابلة للتوسيع يمكن تجاهلها في أي وقت. وبالتالي ، إذا تم إنهاء جميع مؤشرات الترابط الأمامية ، فسيتم إتلاف جميع مؤشرات الترابط في الخلفية تلقائيًا عند إلغاء تحميل مجال التطبيق. لإنشاء مؤشرات ترابط في الخلفية ، اضبط خاصية IsBackground على true.

أخبر عن حالات الخيوط: الجري ، المعلق ، الجري ، لكن في انتظار شيء ما.

مشكلة مزامنة الموضوع والموارد المشتركة.

تفاعل الخيوط

في بيئة متعددة مؤشرات الترابط ، غالبًا ما تكون هناك مشكلات مرتبطة باستخدام نفس البيانات أو الأجهزة عن طريق سلاسل عمليات التنفيذ المتوازية. لحل مثل هذه المشاكل ، يتم استخدام طرق تفاعل الخيط مثل كائنات المزامنة والإشارات والأقسام والأحداث الحرجة.

موتكسهو كائن مزامنة يتم تعيينه على حالة إشارة خاصة عندما لا يكون مشغولاً بأي مؤشر ترابط. يمتلك مؤشر ترابط واحد هذا الكائن في أي وقت معين ، ومن هنا يأتي اسم هذه الكائنات (من الوصول الحصري للغة الإنجليزية) - يتم استبعاد الوصول المتزامن إلى مورد مشترك. بعد اتخاذ جميع الإجراءات اللازمة ، يتم تحرير كائن المزامنة (mutex) ، مما يمنح مؤشرات الترابط الأخرى إمكانية الوصول إلى المورد المشترك. يمكن أن يدعم الكائن الالتقاط المتكرر مرة ثانية بواسطة نفس مؤشر الترابط ، وزيادة العداد دون حظر مؤشر الترابط ، ثم يتطلب إلغاء تخصيصات متعددة. هذا ، على سبيل المثال ، القسم المهم في Win32. ومع ذلك ، هناك بعض التطبيقات التي لا تدعم هذا وتتسبب في توقف مؤشر الترابط عند محاولة الالتقاط المتكرر. هذا هو FAST_MUTEX في Windows kernel.

إشاراتهي الموارد المتاحة التي يمكن الحصول عليها من خلال مؤشرات ترابط متعددة في نفس الوقت حتى يصبح تجمع الموارد فارغًا. ثم يجب أن تنتظر مؤشرات الترابط الإضافية حتى يتوفر المقدار المطلوب من الموارد مرة أخرى. تعتبر Semaphores فعالة للغاية لأنها تسمح بالوصول المتزامن إلى الموارد.

التطورات... كائن يخزن بت واحد من المعلومات "بإشارة أم لا" ، يتم من خلاله تحديد "إشارة" العمليات و "إعادة التعيين إلى حالة غير مؤشرة" و "انتظار". انتظار حدث تم الإشارة إليه هو عدم وجود عملية مع استمرار فوري لتنفيذ مؤشر الترابط. يؤدي انتظار حدث غير محدد إلى تعليق مؤشر الترابط حتى يشير مؤشر ترابط آخر (أو المرحلة الثانية من معالج المقاطعة في OS kernel) إلى الحدث. من الممكن انتظار عدة أحداث في الوضعين "أي" أو "الكل". من الممكن أيضًا إنشاء حدث يتم إعادة تعيينه تلقائيًا إلى حالة بدون إشارات بعد إيقاظ الخيط المنتظر الأول - والوحيد - (يتم استخدام مثل هذا الكائن كأساس لتنفيذ كائن "القسم الحرج"). يتم استخدامها بنشاط في MS Windows ، سواء في وضع المستخدم أو في وضع kernel. يوجد كائن مشابه في نواة Linux يسمى kwait_queue.

الأقسام الحرجةتوفير مزامنة مماثلة للكائنات المزامنة ، باستثناء أن الكائنات التي تمثل الأقسام الحرجة متوفرة في نفس العملية. يمكن أيضًا استخدام الأحداث ، كائنات المزامنة ، والإشارات في تطبيق أحادي العملية ، ولكن عمليات تنفيذ الأقسام الهامة في بعض أنظمة التشغيل (مثل Windows NT) توفر آلية مزامنة حصرية متبادلة أسرع وأكثر كفاءة - احصل على العمليات وأطلقها في القسم الحرج تم تحسينها لحالة مؤشر ترابط واحد (بدون تنازع) لتجنب أي استدعاءات للنظام تؤدي إلى نواة نظام التشغيل. مثل كائنات المزامنة ، لا يمكن استخدام كائن يمثل قسمًا هامًا إلا من خلال مؤشر ترابط واحد في كل مرة ، مما يجعلها مفيدة للغاية لتحديد الوصول إلى الموارد المشتركة.

المتغيرات الشرطية(كوندفارس). إنها تشبه الأحداث ، لكنها ليست كائنات تشغل الذاكرة - يتم استخدام عنوان المتغير فقط ، ولا يوجد مفهوم "محتويات المتغير" ، ويمكن استخدام عنوان كائن عشوائي كمتغير شرطي . على عكس الأحداث ، فإن تعيين متغير الشرط إلى حالة ذات إشارة ليس له عواقب إذا لم يكن هناك حاليًا سلاسل رسائل في انتظار المتغير. يستلزم تحديد حدث في حالة مماثلة تخزين الحالة "المُشار إليها" داخل الحدث نفسه ، وبعد ذلك تستمر الخيوط التالية التي ترغب في انتظار الحدث في التنفيذ فورًا دون توقف. للاستفادة الكاملة من مثل هذا الكائن ، من الضروري أيضًا تحرير كائن المزامنة (mutex) وانتظار المتغير الشرطي ذريًا. يتم استخدامها على نطاق واسع في أنظمة التشغيل المشابهة لـ UNIX. تعتبر المناقشات حول مزايا وعيوب الأحداث والمتغيرات الشرطية جزءًا بارزًا من المناقشات حول مزايا وعيوب Windows و UNIX.

منفذ إكمال الإدخال / الإخراج(منفذ الإكمال IO ، IOCP). كائن "قائمة الانتظار" الذي تم تنفيذه في نواة نظام التشغيل ويمكن الوصول إليه من خلال استدعاءات النظام مع العمليات "وضع الهيكل في ذيل قائمة الانتظار" و "أخذ الهيكل التالي من رأس قائمة الانتظار" - توقف المكالمة الأخيرة مؤقتًا تنفيذ الموضوع إذا كانت قائمة الانتظار فارغة ، وحتى مؤشر ترابط آخر لن تجعل المكالمة إلى "وضع". الميزة الأكثر أهمية لـ IOCP هي أنه يمكن وضع الهياكل فيه ليس فقط من خلال استدعاء نظام صريح من وضع المستخدم ، ولكن أيضًا ضمنًا ضمن نواة نظام التشغيل كنتيجة لعملية الإدخال / الإخراج غير المتزامنة المكتملة على أحد واصفات الملفات. لتحقيق هذا التأثير ، يجب استخدام استدعاء نظام "ربط ملف واصف بـ IOCP". في هذه الحالة ، تحتوي البنية الموضوعة في قائمة الانتظار على رمز الخطأ لعملية الإدخال / الإخراج ، وأيضًا ، إذا نجحت هذه العملية ، فسيتم إدخال عدد البايتات التي تم إدخالها أو إخراجها بالفعل. يحد تنفيذ منفذ الإكمال أيضًا من عدد الخيوط التي تعمل على معالج / نواة واحدة بعد وضع الهيكل في قائمة الانتظار. الكائن خاص بـ MS Windows ، ويسمح بمعالجة طلبات الاتصال الواردة وقطع البيانات في برنامج الخادم في بنية حيث يمكن أن يكون عدد الخيوط أقل من عدد العملاء (لا توجد متطلبات لإنشاء سلسلة رسائل منفصلة مع تكاليف الموارد لـ كل عميل جديد).

تجمع الخيوط

أخبر عن تجمع الخيوط

الكثير من الحديث تطبيقات لمنصات المحمول(iOS ، Android ، إلخ) يعمل جنبًا إلى جنب مع الخادم. التطبيق الذي يحتوي على بيانات قديمة يفقد فائدته. لذلك ، من المهم التأكد من تحديث البيانات من الخادم إلى الجهاز باستمرار. ينطبق هذا على التطبيقات غير المتصلة بالإنترنت التي يجب أن تعمل بدون الإنترنت. بالنسبة للتطبيقات عبر الإنترنت بالكامل التي لا تعمل (أو عديمة الفائدة) بدون الإنترنت (على سبيل المثال ، Foursquare ، Facebook) ، هناك خصائص خارجة عن نطاق هذه المقالة.

باستخدام مثال أحد تطبيقاتنا غير المتصلة بالإنترنت ، سأخبرك بالطرق التي استخدمناها لمزامنة البيانات. في الإصدارات الأولى لقد تطورناخوارزميات بسيطة ، وفي المستقبل ، مع الخبرة ، قمنا بتحسينها. يتم تقديم تسلسل مماثل في المقالة - من الممارسات الواضحة البسيطة إلى الممارسات الأكثر تعقيدًا.

يجب توضيح أن المقالة تتناول نقل البيانات في اتجاه واحد فقط: من الخادم إلى الجهاز. هنا الخادم هو مصدر البيانات.

أحكام عامة لجميع المناهج

على سبيل المثال ، سننظر في نقل دليل الأطباق إلى الجهاز ("الأطباق"). سنفترض أن الجهاز يقدم طلبًا للحصول على عنوان url "/ service / dish / update" ، ويتم التبادل عبر بروتوكول http بتنسيق JSON ( www.json.org). يحتوي الخادم على جدول "أطباق" مع الحقول التالية: المعرف (معرف السجل) ، الاسم (اسم الطبق) ، تم تحديثه (لحظة تحديث الطبق ، من الأفضل دعم المنطقة الزمنية على الفور ، "YYYY-MM-DDThh : mm: ssTZD "، على سبيل المثال ،" 1997 -07-16T19: 20: 30 + 01: 00 ") ، تم حذفه (علامة السجل المحذوف).

ملاحظة بخصوص وجود الحقل الأخير. بشكل افتراضي ، تكون قيمته 0. في تطبيق حيث تتم مزامنة الكيانات بين العميل والخادم ، لا يوصى بحذف البيانات فعليًا من الخادم (لتجنب الأخطاء). لذلك ، تم تعيين is_deleted = 1 للأطباق المحذوفة. عندما يصل كيان بـ is_deleted = 1 إلى الجهاز ، يتم حذفه من الجهاز.

مع أي طريقة ، والتي سيتم النظر فيها أدناه ، يقوم الخادم بإرجاع مصفوفة من العناصر إلى أجهزة JSON (قد تكون فارغة):

[
(هوية شخصية: ، اسم: ، محدث: ، يتم حذف: },…
]

مثال على استجابة الخادم:

[
(المعرف: 5625 ، الاسم: "الخبز" ، تم التحديث: "2013-01-06 06:23:12" ، تم الحذف: 0) ،
(المعرف: 23 ، الاسم: "سميد مطبوخ" ، تم التحديث: "2013-02-01 14:44:21" ، تم الحذف: 0) ، (

الاسم: "حساء السمك" ،

تم التحديث: "2016-08-02 07:05:19"،

مبادئ تحديث البيانات على الجهاز

  1. إذا ظهر عنصر موجود على الجهاز وتم حذفه = 0 ، فسيتم تحديثه
  2. إذا وصل عنصر غير موجود على الجهاز ، وتم حذفه = 0 ، فسيتم إضافته
  3. إذا ظهر عنصر موجود على الجهاز وتم حذفه = 1 ، فسيتم حذفه
  4. إذا وصل عنصر غير موجود على الجهاز ، وتم حذفه = 1 ، فلن يتم فعل أي شيء

المقاربة 1: كل شيء دائمًا في حالة تزامن

هذه هي الطريقة الأسهل. يطلب الجهاز قائمة الأطباق من الخادم ويرسل الخادم القائمة بأكملها. في كل مرة تأتي القائمة بأكملها. لم يتم فرزها.

طلب مثال: لاغٍ أو "()"

مزايا:

  • المنطق على الخادم بسيط - نحن نقدم كل شيء دائمًا
  • المنطق على الجهاز بسيط - نحن دائمًا نكتب فوق كل شيء

سلبيات:

  • إذا طلبت القائمة كثيرًا (كل 10 دقائق) ، فسيكون هناك الكثير من حركة المرور على الإنترنت
  • إذا تم طلب القائمة نادرًا (مرة واحدة يوميًا) ، فسيتم انتهاك أهمية البيانات

منطقة التطبيق:

  • لتطبيقات حركة المرور المنخفضة
  • نقل البيانات التي نادرًا ما تتغير (قائمة المدن ، الفئات)
  • نقل إعدادات التطبيق
  • في بداية المشروع لأول نموذج أولي لتطبيق الهاتف المحمول

الأسلوب 2: مزامنة الملف المحدث فقط

يطلب الجهاز قائمة بالأطباق ، محدثة من المزامنة السابقة. تأتي القائمة مرتبة حسب "المحدثة" بترتيب تصاعدي (اختياري ، لكن ملائم). يقوم الجهاز بتخزين القيمة "المحدثة" لأحدث طبق تم إرساله ، وبناءً على الطلب التالي ، يرسلها إلى الخادم في معلمة "lastUpdated". يرسل الخادم قائمة بالأطباق الأحدث من "lastUpdated" (تم التحديث> lastUpdated). عند الطلب الأول إلى الخادم “lastUpdated” = فارغة.

طلب مثال: (lastUpdated: “2013-01-01 00:00:00”)

في الرسم التخطيطي: “last_updated” هي القيمة المخزنة على الجهاز. عادة ، يتم إنشاء جدول منفصل على الجهاز لتخزين هذه القيم "الأخيرة_التي تم تحديثها" لكل كيان (طبق ، مدينة ، مؤسسة ، إلخ.)

هذا الأسلوب مناسب لمزامنة القوائم الخطية البسيطة التي لها نفس قواعد الوصول لجميع الأجهزة. لمزيد من المزامنة الانتقائية ، راجع "الأسلوب 5: المزامنة مع معرفة ما هو موجود بالفعل على الجهاز".

عادة ما يغطي هذا النهج معظم الاحتياجات. تأتي البيانات الجديدة فقط إلى الجهاز ، ويمكنك المزامنة كل دقيقة على الأقل - ستكون حركة المرور صغيرة. ومع ذلك ، هناك مشاكل مرتبطة بالقيود المفروضة على الأجهزة المحمولة. هذه هي الذاكرة والمعالج.

الأسلوب 3: مزامنة على دفعات

الأجهزة المحمولة منخفضة في ذاكرة الوصول العشوائي. إذا كان الدليل يحتوي على 3000 طبق ، فقد يؤدي تحليل سلسلة json كبيرة من الخادم إلى كائنات على الجهاز إلى نقص في الذاكرة. في هذه الحالة ، سيتعطل التطبيق أو لا يحفظ 3000 طبق. ولكن حتى إذا كان الجهاز قادرًا على استيعاب مثل هذه السلسلة ، فسيكون أداء التطبيق في لحظات المزامنة في الخلفية منخفضًا (تأخر الواجهة ، وليس التمرير السلس ، وما إلى ذلك) لذلك ، من الضروري طلب القائمة بحجم أصغر أجزاء.

للقيام بذلك ، يمرر الجهاز معلمة أخرى ("المبلغ") ، والتي تحدد حجم الجزء. يجب إرسال القائمة مرتبة حسب الحقل "المحدث" بترتيب تصاعدي. الجهاز ، على غرار الطريقة السابقة ، يتذكر القيمة "المحدثة" لآخر كيان مرسل ويمررها إلى الحقل "lastUpdated". إذا أرسل الخادم نفس عدد الكيانات بالضبط ، فسيستمر الجهاز في المزامنة ويقدم طلبًا مرة أخرى ، ولكن مع "lastUpdated" المحدث. إذا أرسل الخادم عددًا أقل من الكيانات ، فهذا يعني أنه لا يحتوي على المزيد من البيانات الجديدة ، وتنتهي المزامنة.

في الرسم التخطيطي: "last_updated" و "amount" هي القيم التي يتم تخزينها فيها تطبيق الهاتف المحمول... "Last_item" - آخر كيان (طبق) تم إرساله من الخادم. وستُطلب القائمة التالية أحدث من هذه القيمة.

طلب مثال: (lastUpdated: “2013-01-01 00:00:00” ، المبلغ: 100)

مزايا:

  • يستقبل الجهاز أكبر قدر ممكن من البيانات يمكنه معالجتها في وقت واحد. يتم تحديد حجم الوجبة عن طريق الاختبارات العملية. يمكن مزامنة كيانات بسيطة 1000 كيانات في المرة الواحدة. ولكن يحدث أيضًا أن الكيانات التي لديها عدد كبير من الحقول ومنطق معالجة التخزين المعقد لا تتم مزامنتها بشكل طبيعي أكثر من 5 قطع.

سلبيات:

  • إذا كان هناك 250 طبقًا بنفس التحديث ، فعندئذٍ مع المبلغ = 100 ، لن يتم إرسال آخر 150 طبقًا إلى الأجهزة. هذا الموقف حقيقي تمامًا ويتم وصفه في النهج التالي.

الأسلوب 4: التوقيت الصحيح للدفعة

في النهج السابق ، من الممكن أنه إذا كان هناك 250 طبقًا في الجدول بنفس "محدث" (على سبيل المثال ، "2013-01-10 12:34:56") وحجم الجزء هو 100 ، فعندئذٍ فقط سيأتي أول 100 سجل. سيتم قص الـ 150 المتبقية بشكل ثابت (محدث> آخر تحديث). لماذا سيحدث هذا؟ عند طلب أول 100 سجل ، سيتم تعيين lastUpdated على "2013-01-10 12:34:56" وسيتضمن الطلب التالي الحالة (تم التحديث> "2013-01-10 12:34:56"). حتى تخفيف الحالة (تم التحديث> = "2013-01-10 12:34:56") لن يساعد ، لأن الجهاز سيطلب ما لا نهاية أول 100 سجل.

الوضع مع نفس "المحدثة" ليست نادرة جدا. على سبيل المثال ، عند استيراد البيانات من ملف نصي ، تم تعيين الحقل "المحدث" على NOW (). قد يستغرق استيراد ملف بآلاف الأسطر أقل من ثانية. قد يحدث أيضًا أن الدليل بأكمله سيكون له نفس "المحدث".

لإصلاح ذلك ، تحتاج إلى استخدام بعض مجالات الأطباق التي ستكون فريدة على الأقل في غضون لحظة واحدة ("محدثة"). يعتبر حقل "المعرف" فريدًا في جميع أنحاء الجدول بأكمله ، لذا يجب عليك استخدامه أيضًا في المزامنة.

لذلك ، يبدو تنفيذ هذا النهج على هذا النحو. يعرض الخادم القائمة التي تم فرزها حسب "مُحدَّث" و "معرّف" ، وتطلب الأجهزة البيانات باستخدام "lastUpdated" والمُعامل الجديد "lastId". في الخادم ، يكون شرط التحديد أكثر تعقيدًا: ((محدث> lastUpdated) أو (محدث = lastUpdated و id> lastId)).

في الرسم التخطيطي: "last_updated" و "last_id" و "amount" هي القيم المخزنة في تطبيق الهاتف المحمول. "Last_item" - آخر كيان (طبق) تم إرساله من الخادم. وستُطلب القائمة التالية أحدث من هذه القيمة.

الأسلوب 5: تزامن مع معرفة ما هو موجود بالفعل على الجهاز

لا تأخذ الأساليب السابقة في الاعتبار حقيقة أن الخادم لا يعرف حقًا مدى نجاح حفظ البيانات على الجهاز. لم يتمكن الجهاز ببساطة من حفظ بعض البيانات بسبب أخطاء غير مبررة. لذلك ، سيكون من الجيد تلقي تأكيد من الجهاز بأن جميع الأطباق (أو ليس كلها) قد تم حفظها.

بالإضافة إلى ذلك ، يمكن لمستخدم التطبيق تكوين التطبيق بحيث يحتاج فقط إلى جزء من البيانات. على سبيل المثال ، يريد المستخدم مزامنة أطباق من مدينتين فقط من أصل 10. لا يمكن تحقيق ذلك من خلال عمليات المزامنة الموضحة أعلاه.

الفكرة من وراء هذا النهج هي كما يلي. يخزن الخادم (في جدول منفصل "store_item_list") معلومات حول الأطباق الموجودة على الجهاز. يمكن أن يكون مجرد قائمة من أزواج "معرف - المحدثة". يحتوي هذا الجدول على جميع قوائم أزواج الأطباق "المحدثة معرف" لجميع الأجهزة.

يرسل الجهاز معلومات حول الأطباق المتوفرة على الجهاز (قائمة أزواج "معرف - محدث") إلى الخادم مع طلب التزامن. عند الطلب ، يتحقق الخادم من الأطباق التي يجب أن تكون على الجهاز وأيها الآن. ثم يتم إرسال الفرق إلى الجهاز.

كيف يحدد الخادم الأطباق التي يجب أن تكون على الجهاز؟ في أبسط الحالات ، يقدم الخادم طلبًا سيعيد قائمة بأزواج "معرف - المحدثة" لجميع الأطباق (على سبيل المثال ، معرف التحديد ، محدث من الأطباق). في الرسم التخطيطي ، يتم ذلك بواسطة طريقة "WhatShouldBeOnDeviceMethod ()". هذا هو عيب النهج - يجب على الخادم أن يحسب (أحيانًا إجراء استعلامات SQL ثقيلة) ما يجب أن يكون على الجهاز.

كيف يحدد الخادم الأطباق الموجودة على الجهاز؟ يقوم بعمل استعلام لجدول "store_item_list" لهذا الجهاز ويحصل على قائمة بأزواج "id - updated".

من خلال تحليل هاتين القائمتين ، يقرر الخادم ما يجب إرساله إلى الجهاز وما يجب حذفه. في الرسم البياني ، هذا هو “delta_item_list”. لذلك ، لا يحتوي الطلب على "lastUpdated" و "lastId" ، ويتم تنفيذ مهمتهم بواسطة الأزواج "id - updated".

كيف يعرف الخادم عن الأطباق المتوفرة على الجهاز؟ في الطلب إلى الخادم ، تمت إضافة معلمة جديدة "عناصر" ، والتي تحتوي على قائمة بمعرف الأطباق التي تم إرسالها إلى الجهاز في آخر مزامنة ("device_last_stored_item_list"). بالطبع ، يمكنك إرسال قائمة بمعرف جميع الأطباق الموجودة على الجهاز ، وليس تعقيد الخوارزمية. ولكن إذا كان هناك 3000 طبق على الجهاز وتم إرسالها جميعًا في كل مرة ، فستكون تكاليف المرور مرتفعة جدًا. في الغالبية العظمى من عمليات المزامنة ، ستكون معلمة "العناصر" فارغة.

يجب أن يقوم الخادم باستمرار بتحديث "المخزن_قائمة العناصر" بالبيانات التي تأتي من الجهاز في معلمة "العناصر".

يجب عليك تنفيذ آلية لمسح بيانات الخادم في المخزن_item_list. على سبيل المثال ، بعد إعادة تثبيت أحد التطبيقات على الجهاز ، ستفترض وحدة الخدمة أن الجهاز لا يزال محدثًا. لذلك ، عند تثبيت التطبيق ، يجب على الجهاز إبلاغ الخادم بطريقة ما بحيث يمسح قائمة العناصر_المخزنة لهذا الجهاز. في تطبيقنا ، نرسل معامل إضافي "clearCache" = 1 في هذه الحالة.

استنتاج

جدول ملخص بخصائص هذه الأساليب:

نهج حجم حركة المرور(5 - كبير) كثافة اليد العاملة في التنمية(5 - مرتفع) استخدام ذاكرة الجهاز(5 - مرتفع) صحة البيانات الموجودة على الجهاز(5 - مرتفع) يمكنك اختيار جهاز معين
1 تتم مزامنة كل شيء دائمًا 5 1 5 5 لا
2 فقط المحدثة 1 2 5 3 لا
3 التزامن على دفعات 1 3 1 3 لا
4 التزامن الصحيح على دفعات 1 3 1 3 لا
5 التزامن مع معرفة ما هو موجود بالفعل على الجهاز 2 5 2 5 نعم

"صحة البيانات على الجهاز" هو احتمال احتواء الجهاز على جميع البيانات التي تم إرسالها بواسطة الخادم. في حالة النهجين # 1 و # 5 ، هناك يقين بنسبة 100٪ أن الجهاز يحتوي على جميع البيانات التي يحتاجها. في حالات أخرى ، لا يوجد مثل هذا الضمان. هذا لا يعني أنه لا يمكن استخدام مناهج أخرى. إنه فقط في حالة فقد جزء من البيانات على الجهاز ، فلن يعمل على إصلاحه من الخادم (وأكثر من ذلك لمعرفة ذلك على جانب الخادم).

ربما ، في ظل وجود تعريفات إنترنت غير محدودة وواي فاي مجاني ، ستصبح مشكلة الحد من حركة المرور الناتجة عن تطبيق الهاتف المحمول أقل أهمية. ولكن بينما يتعين عليك الذهاب إلى جميع أنواع الحيل ، ابتكر أساليب أكثر ذكاءً يمكنها تقليل تكاليف الشبكة وزيادة أداء التطبيق. لا تعمل دائما. في بعض الأحيان يكون "الأبسط ، الأفضل" ، حسب الحالة. نأمل ، من هذه المقالة ، أن تتمكن من اختيار نهج مفيد.

هناك عدد قليل من الأوصاف بشكل مدهش لمزامنة الخادم على الإنترنت و أجهزة محمولة... علاوة على ذلك ، هناك العديد من التطبيقات التي تعمل وفقًا لهذا المخطط. للمهتمين ، زوج من الروابط.

غير متصل في الماضي ، كونك متصلاً بالإنترنت اليوم أمر لا بد منه. على الأقل بالنسبة لعالم الأعمال الحديث. عروض تقديمية لمنتجات وخدمات العلامة التجارية ، والطلب والتسليم عبر الإنترنت ، والحفاظ على قاعدة العملاء ، والتواصل مع العملاء ، وأكثر من ذلك بكثير - كل هذا مستحيل ببساطة بدون وجود الإنترنت. إذا كنت بحاجة إلى تطبيق ، فيجب أن يكون لديك واجهة أمامية (واجهة ويب) ونهاية خلفية (نهاية خلفية لتطبيقك). وإذا كنت تريد أن تكون قادرًا على تحرير محتوى التطبيق الخاص بك دون مشاركة المطورين ، فأنت بحاجة إلى لوحة إدارة جيدة.

بينما يتم إنشاء الواجهة الأمامية في تطبيقات الأجهزة المحمولة باستخدام تقنيات مثل X-Code و Java ، فإن الواجهة الخلفية ، حيث سيتم تخزين قاعدة البيانات وجميع منطق التطبيق ، تتطلب معرفة مهنية بلغة برمجة من جانب الخادم. من الأمثلة الجيدة على ذلك PHP ، والتي يمكن القول إنها أكثر لغات البرمجة شيوعًا المستخدمة في أي تطوير من جانب الخادم تقريبًا. هذا هو القائد بلا منازع.

هناك العديد من الاستخدامات لـ PHP: مواقع الويب الثابتة والديناميكية + أنظمة إدارة المحتوى المخصصة ، والوسائط الاجتماعية ، وأنظمة CRM المتخصصة ، وبرامج التجارة الإلكترونية ، والمزيد. بالطبع ، هناك أجزاء خادم ولوحات تحكم مجانية أو رخيصة. ومع ذلك ، في كثير من الحالات ، لا يوفرون المستوى المطلوب من الملاءمة والتخصيص وإمكانية الترقية.

يعمل المبرمجون لدينا مع التقنيات لتنفيذ مجموعة واسعة من الحلول لأهداف واحتياجات ومتطلبات العمل المختلفة. نقوم بتحليل متطلبات النظام لكل مشروع على حدة ونستخدم العديد من برامج الخادم المتخصصة لتحقيق الأداء الأمثل لتطبيق الهاتف المحمول الخاص بك.

إذا كنت تبحث عن فريق يمكنه أن يقودك إلى الحل الأذكى والأكثر فعالية من حيث التكلفة لبناء تطبيق من البداية ، أو إعادة إنشاء تطبيق موجود لتجربة مستخدم مثالية ، فلن تحتاج إلى البحث بعد الآن. Appsmob جاهز لمساعدتك في العثور على أفضل حل لك.

الجانب السلبي لعملاء المحمول هو الخادم.

تعتمد المتطلبات الإضافية على تفاصيل التطبيق:
قابلية تطوير الخادم - بالنسبة إلى SaaS ، والتطبيقات الاجتماعية ، حيث يُتوقع ، بشكل مثالي ، تدفق كبير من الزوار ، وهذا الشرط إلزامي. بالنسبة لتطبيقات الأعمال حيث توجد قيود على عدد المستخدمين أو حيث يتم توقع العدد ، فإن هذه الخاصية غير مطلوبة ؛
التفاعلية: يلزم تزويد عدد من التطبيقات بآلية إعلام - إبلاغ التطبيق (المستخدم) بحدوث أحداث معينة ، وإرسال رسالة إلى المستخدم. يجب أن تكون هذه الممتلكات مملوكة ، على سبيل المثال ، عن طريق نظام الصرف أو المرسل الآلي لسيارات الأجرة.
Open API: من المفترض أن مطوري الطرف الثالث يمكنهم استخدام وظائف النظام من خلال بروتوكول موثق. بعد كل شيء ، يمكن أن يكون العميل إما تطبيق خادم محمول أو تطبيق خادم خارجي.
متطلبات اخرى ...

أمر
من الناحية المثالية ، يمكن أن يكون تكوين فريق المشروع لتطوير النظام على النحو التالي:
مدير المشروع: يدير المشروع ويتحكم فيه ويتفاعل مباشرة مع العميل ؛
مطور تطبيق الخادم: يطور خادم منطق الأعمال وقاعدة البيانات وبروتوكول الشبكة ؛
مطور تطبيق المسؤول: يطور تطبيق ويب ، واجهة مستخدم لتكوين تطبيق الخادم وإدارته ؛
مطور تطبيق العميل لنظام Android ؛
مطور تطبيق عميل iOS ؛
مطور تطبيق العميل لـ ...
الفاحص: يختبر تطبيق المسؤول وتطبيقات العميل.

سيلاحظ القارئ اليقظ أنه إذا كتبت تطبيق خادم بواجهة رسومية ، على سبيل المثال ، في HTML5 ، يمكنك توفير المال. في هذه الحالة ، لا يلزم تطوير تطبيقات العميل - يتم توفير واجهة المستخدم بواسطة المتصفح. لا تتناول هذه المقالة مثل هذه الحالة ، فهي تتعلق بتطوير تطبيقات "أصلية" (أصلية) للأجهزة المحمولة.

لقد عملت في فريق متكامل ، لكنني سأكون واقعيًا - لا تسمح لك الموارد البشرية والميزانية دائمًا بتجميع مثل هذا الفريق. وأحيانًا يجب الجمع بين الأدوار: مدير المشروع + مطور تطبيق الخادم ، مطور تطبيق العميل + المختبر.

التقنيات والأدوات والمكتبات
لتطوير خادم لعملاء الأجهزة المحمولة ، عادةً ما أستخدم الحزمة التالية من التقنيات "المجانية":
Apache Tomcat عبارة عن حاوية servlet ؛
MySQL - نظم إدارة قواعد البيانات ؛
التخريب هو نظام التحكم في الإصدار ؛
Maven هو إطار لأتمتة بناء المشروع ؛
JUnit - ستوفر ؛
Apache Log4j - مكتبة التسجيل ؛
جينكينز - نظام التكامل المستمر ؛
السبات - ORM (الإعدادات والتكوين في الخصائص وملفات xml والشروح) ؛
hibernate-generic-dao - تنفيذ DAO من Google ، يطبق الطرق الأساسية للعمل مع بيانات قاعدة البيانات ، ويبسط تنفيذ التصفية والفرز في الأساليب ؛
- تنفيذ المصادقة والتفويض (الأمان) ، حاوية الخدمات والفاصوليا (التكوين في ملفات xml وفي التعليقات التوضيحية) ، نستخدمها أيضًا عند إنشاء الاختبارات.

اعتمادًا على تفاصيل النظام ومتطلباته ، أستخدم أحد الخيارين لتنفيذ بروتوكول تبادل البيانات.
عندما تكون الأنظمة الأساسية والأداء والبساطة والكفاءة وقابلية التوسع وفتح واجهة برمجة التطبيقات مطلوبة ، فإنني أستخدم جيرسي - تنفيذ خدمات الويب REST (خدمات الويب RESTful). تتيح لك هذه المكتبة استخدام JSON و / أو تسلسل بيانات XML. يتم تكوين REST من خلال التعليقات التوضيحية. للتبادل مع الأجهزة المحمولة ، تم أخذ تنسيق JSON نظرًا لأنه يحتوي على تطبيق أبسط من جانب العميل (لهذا السبب ، لا نستخدم خدمات الويب "الكلاسيكية") ، يتم إنشاء حركة مرور أقل. يسمح لك جيرسي بضبط "مظهر" JSON الأكثر ملاءمة.
خلاف ذلك ، إذا كنت بحاجة إلى منصة مشتركة ، وأداء عالٍ ، وبساطة ، وكفاءة ، وتفاعلية ، فأنا أتعامل معها
Apache MINA هو إطار عمل لبناء تطبيقات الشبكة ،
Google protobuf عبارة عن مكتبة منظمة لترميز البيانات وفك تشفيرها. يتم تحديد بنية البيانات بواسطة ملفات الرأس * .proto ، يقوم المترجم بإنشاء فئات Java منها (هناك أيضًا إمكانية إنشاء لغات البرمجة الأخرى: C ++ ، و Objective-C ، وما إلى ذلك ، مما يوفر النظام الأساسي المشترك خاصية)؛
java.util.concurrent - نستخدم الحزمة القياسية.
يمكن تحجيم هذا الخيار ، لكن يجب وضعه في مرحلة التصميم على مستوى العمارة ، مع مراعاة منطق الأعمال.

دعونا نفكر في مهمة افتراضية باستخدام مثال اختيار التقنيات لخدمة SaaS حقيقية - "مزاد الخدمات" Auknem "، والذي يسمح للأشخاص بتقديم طلب لأداء الخدمات أو الأعمال المطلوبة ، والمنظمات ، بدورها ، تغادر مقترحاتهم لهم. نحن نأخذ جميع المتطلبات الأساسية بشكل افتراضي. نظرًا لحقيقة أن التسجيل في هذا النظام مجاني ومجاني ، فمن الضروري بالتأكيد إضافة قابلية التوسع إليها. ماذا عن التفاعل؟ سيكون من الرائع إبلاغ المقاولين (فناني الأداء) بإنشاء طلبات جديدة ، وإبلاغ العملاء بالمقترحات التي يتم تلقيها في نفس اللحظة في التطبيق ، وليس فقط عن طريق البريد الإلكتروني. على أساس هذا ، نأخذ في تنفيذ Apache MINA ، Google protobuf. نحن ننظر إلى الخاصية التالية - فتح API. الخدمة متاحة للجمهور ، لذلك لنفترض أن المطورين الخارجيين قد يكونون مهتمين بالتكامل معها. انتظر دقيقة! ليس بسيط جدا. يعتمد بروتوكول Apache MINA تمامًا على التنفيذ والتكامل دون معرفة الفروق الدقيقة ليس شفافًا بأي حال من الأحوال. في مثل هذه الحالة ، سيتعين عليك تقييم العامل الأكثر أهمية والاختيار.

استنتاج
سأكون مهتمًا بمعرفة التقنيات والمكتبات التي استخدمتها عند تطوير خادم للأجهزة المحمولة أو أنظمة مماثلة؟ كل شيء يتغير ، لا شيء يدوم إلى الأبد ، في كل مستوى هناك بدائل لها مزاياها وعيوبها: MySQL -

دعم

لماذا تحتاج إلى نسخ احتياطية على منصة متنقلة

يعرف الخبراء كيف تكون تطبيقات الهاتف المحمول غير الموثوقة في بعض الأحيان على 1C: قد تحدث أخطاء في أي وقت ، بسبب انهيار قاعدة المستخدمين ببساطة. في الوقت نفسه ، نواجه عدم موثوقية الأجهزة نفسها: يمكن كسرها ، وفقدانها ، ويمكن سرقتها ، ويريد المستخدمون الاحتفاظ ببياناتهم. وحتى الإصدار 8.3.9 ، لم تكن لدينا آلية نظام أساسي لحفظ نسخة احتياطية.

نظرًا لأنه لم يكن لدى المستخدمين في السابق زر "حفظ نسخة" ، كان على مطوري تطبيق Boss عمل نسخ احتياطية خاصة بهم. كيف فعلنا ذلك؟

نحفظ بيانات قاعدة البيانات بصيغة XML.

يُنصح بتزويد المستخدم بالعديد من الخيارات لتخزين النسخ - أولاً وقبل كل شيء ، هذا مناسب للعملاء ، يمكنهم اختيار الخيار الأفضل لأنفسهم: التحميل إلى السحابة ، الإرسال إلى بريدهم ، الحفظ على الجهاز.

وبالتالي ، فإن المطورين يؤمنون أنفسهم بالإضافة إلى ذلك. إذا حدث خطأ ما ، وتعطلت آلية إنشاء نسخ على Google Drive أو Yandex Drive فجأة ، فيمكنك دائمًا إخبار المستخدم أن المطور يتعامل حاليًا مع خطأ ، ولكن في الوقت الحالي يمكنه حفظ البيانات بطريقة بديلة. ويشعر المستخدمون بالرضا لأنه يمكنهم أن يطمئنوا بشأن بياناتهم.

بالضرورة بحاجة إلى التركيز على الخدمات السحابية، لأنه في حالة فقد الجهاز أو كسره ، وقام المستخدم بحفظ نسخة على نفس الجهاز ، فستفقد البيانات.

أيضا نحن تأكد من تذكير المستخدم بضرورة إنشاء نسخ احتياطية.

كيف احتفظ بالنسخ إذا تغير التكوين؟

عندما نتحدث عن حل جماعي ، عن تطبيق يتغير باستمرار ويتطور ويُصقل ، يجب أن نأخذ في الاعتبار سلوك العملاء. قد يرغب المستخدم في استعادة نسخة احتياطية محفوظة في نسخة قديمة من التطبيق ، والتي لم يكن لديها أي تفاصيل. ثم تبرز المهمة: قراءة البيانات ، ثم ملء البيانات وفقًا لمنطق التحديث من الإصدار القديم للتطبيق. كيف افعلها؟ بالإضافة إلى البيانات ، احفظ بنية البيانات نفسها ، حتى تعرف فيما بعد كيفية قراءتها.

هناك العديد من الخيارات لتخزين بنية البيانات هذه ، بما في ذلك إمكانية تخزينها في التكوين نفسه. أي أنه في كل مرة يتم فيها إصدار إصدار جديد ، احتفظ بهيكل البيانات الوصفية للإصدار السابق في التخطيط في التهيئة.

لا تنس أنه في تطبيق الهاتف المحمول ، لا ينبغي أن تنمو التهيئة بهذه الطريقة ، يجب أن نقدر المكان فيها ، ويجب أن نجعلها مضغوطة قدر الإمكان. لكن التطبيق يتطور ، وسيكون هناك العديد من هذه التخطيطات ، وبمرور الوقت ستصبح أكثر وأكثر.

لذلك ، في حالة تطبيق الهاتف المحمول ، هناك طريقة أخرى مفضلة - حفظ هيكل البيانات الوصفية مباشرة في ملف البيانات... عند الإخراج ، نحصل على مثل هذا الملف ، حيث نقوم أولاً بتخزين بعض البيانات المساعدة - إصدار التكوين ، ومخطط التكوين ، وحدود التسلسل ، وبعد ذلك نكتب بيانات المستخدم نفسها بتنسيق XML. علاوة على ذلك ، في قسم "البيانات المساعدة" من الملف ، يمكنك أيضًا تخزين البيانات المهمة الأخرى التي ، لسبب ما ، لا يمكن كتابتها في XML.

نأخذ مخطط البيانات الذي تم حفظه في ملف ، وعلى أساسه نقوم ببناء حزمة XDTO لقراءة الملف. نقوم بإنشاء كائن مشابه في قاعدة البيانات ، وملئه ، وإجراء معالجة إعادة التعبئة عند التحديث ، وحفظ الكائن المنتهي بالفعل في قاعدة البيانات.

أدناه في الصورة يمكنك رؤية تلميح حول كيفية كتابة نموذج XDTO لهذه التكوينات بشكل جميل. جربت الشركة التي أصدرت تطبيق Boss هذا ، ووجدت عدة طرق ، لكنها استقرت على هذا الخيار لتسجيل مخطط البيانات الوصفية. عندما تفتح ملف البيانات نفسه ، يمكنك رؤية XML المهيكلة المعتاد ، القابل للقراءة ، والذي يسرد جميع البيانات الوصفية للتطبيق.

// اكتب مخطط التكوين ModelXDTO = FactoryXDTO.ExportModelsXDTO ("http://v8.1c.ru/8.1/data/enterprise/current-config") ؛ XDTO Factory.WriteXML (تحميل ملف ، نموذج XDTO) ؛ // قراءة مخطط التكوين نموذج XDTO = مصنع XDTO. قراءة XML (قراءة XML ، نوع المصنع XDTO. ("http://v8.1c.ru/8.1/xdto"، "Model")) ؛ UnloadFactory = جديد XDTOFactory (XDTOModel) ،

لحماية المستخدم ، من الضروري أن تسأله مرة أخرى عما إذا كان بحاجة إلى استعادة النسخة الاحتياطية. ربما كان يقوم فقط بالتجربة والنقر على جميع الأزرار في التطبيق :) والآن قد تفقد بياناته الحالية. لذلك ، عند القيام بأعمال يحتمل أن تكون "خطرة" ، فإننا نحدد دائمًا ما إذا كان يريد ذلك حقًا ، وكيف ينبغي القيام به. يجب أن يكون المستخدم على دراية بأفعالهم.

يجب أن تكون هناك آلية لإنشاء نسخ احتياطية عندما نتحدث عن حل مستقل ، عندما يكون لدى المستخدم جميع البيانات المخزنة حصريًا على جهاز محمول: يمكن للمستخدم أن يفقد جهازه ، ثم تفقد البيانات. ويبدو أنه إذا كان التطبيق لا يعمل بشكل مستقل ، ولكنه متصل بخادم مركزي ، فلا يجب أن يواجه المستخدم مثل هذه المشكلة ، لأنه في حالة فقد الجهاز ، سيتصل بالخادم ، ويستقبل جميع بياناته من الخادم مرة أخرى ، وسيكون كل شيء على ما يرام.

ومع ذلك ، لا يستخدم المستخدمون دائمًا النسخ الاحتياطية بالطريقة التي نتوقعها منهم: غالبًا ما يستخدمونها ببساطة "لاسترجاع" البيانات. هذا سلوك غريب جدًا حقًا ، لكن مستخدمي تطبيقات الهاتف كسالى للغاية لمعرفة أين يمكن أن يرتكبوا خطأ عند إدخال البيانات ، ويقومون ببساطة باسترجاع البيانات وإعادة إدخال البيانات لليوم الحالي. بعد تحليل إحصائيات العمل مع تطبيق Boss ، أدركنا أن هذه ممارسة عادية وأن سلوك المستخدم هذا أكثر شيوعًا مما كنا نتوقعه.

وإذا كنت تستخدم المزامنة مع أجهزة أخرى ، فعليك التعامل معها. هناك عدة حلول هنا:

  • قطع الاتصال بالخادم ، مع تحديد أن البيانات الموجودة عليه ستبقى كما هي ، وستتم استعادة النسخة فقط على جهاز المستخدم ؛
  • من الأفضل للمستخدم السماح له باستعادة نسخة مرة واحدة على جميع الأجهزة ، بعد أن وصف هذه الآليات مسبقًا.

هناك شيء آخر هنا. حتى الآن ، قمنا بحفظ النسخ الاحتياطية بأنفسنا ، وتحكمنا في العملية بأكملها ، واكتشفنا إجراءات المستخدم مباشرةً في الكود عندما ضغط على زر "حفظ نسخة". كل هذا يمكن معالجته لاحقًا. في النظام الأساسي 8.3.9 ، أصبح من الممكن حفظ النسخ الاحتياطية بالضبط عن طريق النظام الأساسي. ويقوم المستخدم بذلك دون علمنا. إذا تم استخدام المزامنة مع قاعدة بيانات مركزية ، فيجب معالجة مثل هذا السيناريو. يجب أن نكتشف بطريقة ما على خادمنا أن المستخدم قد استعاد نسخة محفوظة مسبقًا ويجب أن نقدم له نوعًا من الحل. لا يمكننا تحمل وجود بيانات خارج المزامنة.

تبادل

عندما نتحدث عن حل خاص على نظام أساسي للجوّال ، عادةً ما يكون لدينا عميل يريد ، على سبيل المثال ، استخدام نظام أساسي للجوّال لوكلاء المبيعات ، وبالتالي يتبادلون البيانات مع قاعدة بيانات مركزية. كل شيء بسيط هنا: قاعدة بيانات واحدة ، عدة أجهزة ، تقوم برفع الخادم ، وإعداد الاتصال به. لذلك من السهل حل مشكلة التبادل بين الأجهزة.

ولكن إذا كنا نتحدث عن تطبيق جماعي ، حيث يوجد العديد من قواعد البيانات ، لكل منها عدد كبير جدًا من المستخدمين ، يصبح الموقف أكثر تعقيدًا. قام المستخدمون بتنزيل التطبيق من السوق وهم يريدون المزامنة مع بعضهم البعض. على سبيل المثال ، قام الزوج بتنزيل تطبيق لحساب الشؤون المالية الشخصية ، والآن يريد أن تتصل زوجته أيضًا ، ويعملان معًا في نفس التطبيق. هناك العديد من المستخدمين ، التطبيق يتطور وينمو وهناك حاجة لعدد كبير وكبير من قواعد البيانات. كيف تنظم كل هذا؟ لن يقوم المستخدمون بالاتصال بالمطورين شخصيًا لإنشاء قاعدة بيانات منفصلة لهم وتمكين المزامنة. إنهم يريدون الضغط على زر وجعله يعمل على الفور. في نفس اللحظة.

كيفية المضي قدما؟ هذا هو المكان الذي تأتي فيه آلية مشاركة البيانات للإنقاذ. يسمح لك بتنظيم قاعدة بيانات واحدة ، حيث يوجد تكوين مشترك واحد ، ولكن في نفس الوقت ، يتم تخزين عدد غير محدود من قواعد المستخدم داخل قاعدة بيانات مشتركة واحدة.

أفضل جزء هو أنه يمكنك إضافة مستخدمين ديناميكيًا وبرمجيًا دون مشاركتنا. في الواقع ، ينقر المستخدمون ببساطة على زر "التسجيل على الخادم" ، وكل شيء يحدث من تلقاء نفسه: يتم إنشاء قاعدة بيانات شخصية له على الخادم ، ويمكنه البدء في العمل فيها على الفور.

كيف افعلها؟ الحل الأول والأسهل هو كتابة قاعدة الخادم الخاصة بك باستخدام هذه الآلية. عندما بدأت شركتنا في إنشاء تطبيق Boss والتبادلات فيه ، في الإصدار الأول فعلنا ذلك تمامًا: كتبنا قاعدة بيانات خادم مع آلية مشاركة البيانات. كل شيء يعمل ، خاصة أنه لم يكن هناك شيء معقد - فاصل القاعدة هو من الدعائم الشائعة.

لكن بعد ذلك أدركنا أننا كنا نعيد اختراع العجلة :) في الواقع ، هناك حل جاهز ، وقد أخذ بالفعل في الاعتبار النقاط التي لم نفكر فيها حتى. هذا هو 1C: طازج.

يتم التفكير في قابلية تطوير الخدمة هنا: ما يجب القيام به عندما يكون هناك الكثير من البيانات وقواعد البيانات ، وكيفية النمو مع كل هذا. هناك نقطة تتعلق بإنشاء نسخ احتياطية من مناطق البيانات: أي أننا لا نقوم فقط بعمل نسخ احتياطية لقاعدة بيانات مشتركة واحدة ، بل نقوم بعمل نسخ من مستخدم معين. علاوة على ذلك ، هناك آلية بحيث يتم عمل النسخ فقط عندما تكون هناك حاجة حقيقية إليها. إذا لم يدخل المستخدم قاعدة البيانات لمدة أسبوع ، فإننا لا نقوم بعمل نسخ منه ، لأنه لم يتغير شيء هناك. ميزة أخرى لـ Fresh هي أن الخدمة تطبق آلية لتقليل الحمل على الخادم ، وهو أمر مهم للغاية عندما يكون لديك الكثير من قواعد البيانات.

بشكل عام ، يعتبر Fresh شيئًا جديدًا وممتعًا بالنسبة لنا. نحاول ببطء اكتشاف ذلك ، لكن في الغالب نحن سعداء بعمله.

نقل البيانات. كيفية تنفيذه للتبادل بين الأجهزة

توفر المنصة آليتين - خدمات SOAP و http. هناك فروق دقيقة في كيفية الوصول إلى هذه الخدمات عند مشاركة آلية مشاركة البيانات. على وجه الخصوص ، تحتاج إلى إضافة معلمات تشير إلى الرقم المحدد للمنطقة التي تقوم بالوصول إليها ، لأن النظام الأساسي لا يمكنه تحديد قاعدة البيانات التي يجب الوصول إليها بواسطة اسم المستخدم. بالإضافة إلى ذلك ، يمكن للمستخدم نفسه العمل مع عدة قواعد بيانات ضمن قاعدة بيانات واحدة (انظر الصورة).

بالنسبة إلى الخدمات ، ينفذ تطبيق Boss التبادل الفوري: يقوم أحد المستخدمين بإدخال البيانات ، ويستقبلها الآخر. اعتاد مستخدمو تطبيقات الهاتف المحمول على حقيقة أن كل شيء يحدث على الفور ، لذلك فكرنا في الخدمة الأفضل للاستخدام - SOAP أو http. لعبت سرعة الاتصال دورًا رئيسيًا. في http ، تكون سرعة الاتصال أعلى بكثير ، وعند الاتصال عبر SOAP ، نحصل على وصف للخدمة ، وهي ثقيلة وتستغرق وقتًا طويلاً للتحميل. النظام الأساسي لديه طريقة لتخزين وصف للخدمة ، ولكن بسبب المعلمات التي نضيفها ديناميكيًا ، لا يمكننا استخدام مراجع WS. بالإضافة إلى ذلك ، يعد الوصول إلى خدمات http أكثر ملاءمة ومرونة ، في تجربتنا.

لذا ، فإن هدفنا هو تنفيذ التبادل في الوقت الفعلي. أي أننا نحاول ألا نجعل المستخدم مضطرًا للذهاب إلى مكان ما ، والنقر على زر ، والتفكير في مدى صلة بياناته ، وما إذا كان يجب عليه تحديثها ... يجب أن تكون البيانات دائمًا ذات صلة بالمستخدمين. لقد اعتادوا العمل في برامج المراسلة الفورية - أحدهم أرسل البيانات ، والآخر استلمها على الفور. كل شيء يحدث على الفور. الأمر نفسه ينطبق على التطبيقات المتعلقة بالأعمال: أصدر أحد البائعين عملية بيع ، ويجب على الآخر رؤية الوضع الحالي على الفور دون اتخاذ أي إجراء.

لذلك ، يستخدم تطبيق Boss وظائف الخلفية للتبادلات. بعد كتابة كل بيانات في قاعدة البيانات ، يتم بدء وظيفة في الخلفية ، والتي تبدأ التبادل. الجزء الأول هو إرسال البيانات إلى الخادم. ثم تحتاج الأجهزة الأخرى إلى معرفة أن هناك بيانات جديدة. لهذا نستخدم إشعارات الدفع. هذا المخطط يعمل بالفعل ويعمل بسرعة كافية.

لكننا أردنا ذلك بشكل أسرع ، لأننا نعمل في الوقت الفعلي وعادة ما يكون لدينا القليل من البيانات. لدينا XML صغير ، لكن في نفس الوقت نرسل رسالة بهذه البيانات من الجهاز الأول إلى الخادم ، يرسل الخادم PUSH إلى جهاز آخر ، ثم يبدأ الجهاز الثاني ، بعد تلقي PUSH ، التبادل من جانبه ، يعالج الخادم ويطلب البيانات ، ويتلقى هذه البيانات ثم يرسل ردًا على أن البيانات قد تم استلامها. هذا وقت طويل ، لكن البيانات نفسها كانت صغيرة جدًا.

فكرنا في كيفية تسريع هذه العملية.

للقيام بذلك ، اكتشفنا ما يحتويه PUSH ، وكيف لا يزال من الممكن استخدامه. اتضح أن PUSH يحتوي على حقول مثل البيانات والنص. تحتوي وثائق iOS و Android على قيود على حجم رسائل PUSH ، لكن هذا لا يبدو كافيًا بالنسبة لنا وأردنا اكتشافه بشكل تجريبي. وقد تحققنا من أن مجموع الأحرف الصالحة لنظام iOS هو 981 حرفًا ، ولأندرويد 3832 حرفًا. في الحالة الأخيرة ، من الممكن تمامًا استخدام التقييد ؛ يمكن حشر كائن أساسي واحد أو أكثر في مثل هذا المجلد. ثم قام مطورو الشركة بتغيير المخطط قليلاً. عندما يكون هناك القليل من البيانات ، نرسلها من جهاز واحد ، ونستلمها على الخادم ، ونحزمها في PUSH هناك ونرسلها مباشرة إلى جهاز آخر فيه. أصبح المخطط أقصر ، وأصبح التبادل أسرع :)

من النقاط المهمة في استخدام PUSH عدم إزعاج المستخدمين.

من السهل جدًا التخلص من هذا الموقف: فقط لا ترسل الكثير من رسائل PUSH للمستخدم :) إذا كان يعمل في التطبيق الآن ، فيمكنك إرسال الكثير من الرسائل. عند تشغيل النظام الأساسي ، لا يرى المستخدم PUSH ، كل شيء يحدث تلقائيًا. ولكن عند إغلاق التطبيق ، يكون لدى العميل الكثير من الرسائل غير المقروءة. لذلك ، لا ينبغي بأي حال من الأحوال إرسال PUSH التالي حتى يتم تلقي استجابة من الجهاز الذي يعمل التطبيق ، ونشط ، وقد تمت معالجة PUSH السابق بالفعل.

فارق بسيط آخر في التبادل هو العمل عبر الويب. نحن بحاجة إلى تحقيق أقصى استفادة من عدم التزامن. لا يمكنك العمل كالمعتاد - اكتب الرمز - اتصل بالوظيفة - انتظر حتى يتم تنفيذها - احصل على الإجابة - وكل شيء على ما يرام. إذا كنت تعمل عبر الويب ، فستظل تواجه قيودًا معينة ، على سبيل المثال ، الإنترنت غير المستقر ، المهلات التي يتم تشغيلها عند إجراء عمليات طويلة. لذلك ، من الضروري التفكير في الهندسة المعمارية مسبقًا.

لنلقِ نظرة على مثال لتسجيل جهاز ، ماذا يحدث في التطبيق عندما يريد المستخدم التسجيل. يحتفظ بالسجلات لفترة من الوقت ، وقد أدخل الكثير من البيانات ، لكنه بعد ذلك يريد من البائع أن يعمل مع قاعدة البيانات هذه أيضًا. ينقر المستخدم على زر "تسجيل". في البداية كان كل شيء بسيطًا للغاية: أخذوا بياناته ، وسجلوها على الخادم ، ومن فضلك ، يمكنك العمل وتوصيل المستخدمين. ولكن بعد ذلك واجهنا موقفًا نمت فيه قواعد البيانات على الجهاز بشكل كبير بحلول وقت التسجيل بالنسبة لبعض المستخدمين. وهذا المخطط لم يعد يعمل منذ ذلك الحين أثناء تسجيل قاعدة البيانات بالكامل على الخادم ، تم تشغيل مهلة الاتصال أو تم قطع الإنترنت ببساطة. لذلك ، قمنا باستبدال مكالمة واحدة متزامنة بالعديد من المكالمات القصيرة. تتم الآن مشاركة البيانات بدلاً من إرسالها مرة واحدة. لا ننتظر بأي شكل من الأشكال حتى يقوم الخادم بمعالجة البيانات وتسجيلها. لقد أرسلنا البيانات ، وتلقينا ردًا على استلام البيانات ، وأغلقنا الاتصال. بشكل دوري ، تحتاج إلى استطلاع رأي الخادم ، وما يحدث هناك وكيف ، وفي الوقت نفسه ، يتم تشغيل وظيفة في الخلفية على الخادم الذي يسجل البيانات المستلمة. بهذه الطريقة نتلقى الكثير من مكالمات الخادم ، لكن لدينا ضمان أن كل شيء سوف يسير على ما يرام. ولن تمنعك المهلات ولا عدم استقرار الإنترنت من تحميل جميع البيانات إلى الخادم.

التحديثات

التبادل بين الأجهزة ذات الإصدارات المختلفة من التطبيق

نظرًا لأننا نتحدث عن تطبيق جماعي يتم طرحه في الأسواق ، يجب أن نأخذ في الاعتبار بعض ميزات عملية التحديث وتبادل البيانات.

إذا أصدرت تطبيقًا لمؤسسة واحدة وقررت تحديثه ، فعادة ما تقوم فقط بإعطاء أمر لجميع الموظفين لتثبيت التطبيق الجديد معًا. لا يمكن القيام بذلك مع المستخدمين الذين قاموا بتنزيل التطبيق من السوق. لا يمكنك إخبارهم بما يجب عليهم فعله على الإطلاق. على سبيل المثال ، هم يعملون في تطبيق ولا يريدون تحديثه الآن أو أبدًا. ليس لديهم تحديث تلقائي ، لذلك من الشائع جدًا أن يتم توصيل العديد من الأجهزة بالقاعدة المركزية ، وكلها مزودة بإصدارات مختلفة. سبب آخر لهذه الظاهرة هو وقت النشر في الأسواق: فهو مختلف لنظامي iOS و Android. غالبًا ما ننفذ الأشياء الرئيسية ، على سبيل المثال ، إصلاح الأخطاء الحرجة ، ولا نريد الانتظار حتى يتحقق نظام التشغيل iOS من الإصدار الجديد لمدة أسبوعين ، فنحن نريد على الأقل لنظام Android فقط ، ولكننا نصدر التحديث الآن.

ليس لدينا الحق في قيادة المستخدمين. إذا أرادوا ، يتم تحديثهم ، وإذا لم يفعلوا ، فلن يفعلوا شيئًا. تُظهر الصورة نسبة عمليات تثبيت تطبيق Boss حسب الإصدارات في GooglePlay ، بالإضافة إلى إحصائيات من خادمنا - النسبة الحقيقية لإصدارات التطبيق المثبتة على الأجهزة التي تبادلت البيانات مع الخادم خلال الأسبوع الماضي. إليك مجموعة للعمل معها. هذه إصدارات مختلفة وبيانات وصفية مختلفة. ونحتاج إلى تنظيم تبادل عادي في نفس الوقت :)

يواجه المطورون المهام التالية:

  • كل هذا يحتاج إلى العمل. يجب ألا يشعر المستخدمون بعدم الراحة لأنهم نسوا الترقية. لا ينبغي أن يلاحظوا ذلك على الإطلاق. محدث - إنه أفضل ، جيد وجيد.
  • يجب علينا ضمان سلامة البيانات. على سبيل المثال ، يمتلك أحد المستخدمين دليلًا ودعائمًا جديدة ، بينما لا يتوفر لدى مستخدم آخر. في الوقت نفسه ، إذا قام مستخدم ليس لديه تفاصيل جديدة بتغيير شيء ما على جهازه ، فيجب عدم فقد البيانات على الأجهزة الأخرى.
  • نحتاج إلى التأكد من تحديث البيانات عند الترقية إلى إصدار جديد. عندما يقرر المستخدم أنه جاهز للتحديث ، يجب أن يحصل تلقائيًا على جميع المعلومات الجديدة التي لم تكن بحوزته لمجرد أن لديه نسخة قديمة.

كيف فعلنا ذلك؟

1. نستخدم خطتي تبادل على الخادم. الأول للمشاركة بين الأجهزة والثاني للتحديثات. على سبيل المثال ، أرسلنا دليلًا إلى مستخدم ، لكن ليس لديه وحدات قياس ، أي بيانات غير كاملة. يجب أن نتذكر هذا. وعندما يتم تحديثه ، يجب أن نرسل إليه جميع المعلومات التي لم تكن بحوزته. هذا ما تهدف إليه خطة التبادل الثانية.

2. لكتابة وقراءة الكائنات ، نستخدم نفس الآلية المستخدمة في النسخ الاحتياطية ، أي أننا نحفظ نسخة البيانات الوصفية. في هذه الحالة ، نحن نعمل مع الخادم ، ويمكننا إضافة أي شيء نريده مباشرة إلى التكوين ، لذلك نقوم ببساطة بإضافة مخططات البيانات الوصفية إلى التكوين في شكل تخطيطات مع تطور التطبيق.

كيفية مراقبة الأخطاء الجسيمة أثناء التبادل وعلى الخادم

أولاً ، تحتاج إلى التحكم في توفر الخادم نفسه. يحدث هذا للخوادم - يسقطون. لم نخترع شيئًا خاصًا للمراقبة ، لكننا وجدنا ببساطة روبوتًا في البرقية يصرخ إذا كان هناك خطأ ما. يقوم بفحص أداء الخادم كل دقيقة ، وإذا كان الخادم غير متاح فجأة ، فإنه يبدأ في الصراخ ، ويراه المسؤولون ويظهرون الخادم.

نقوم أيضًا بتجميع سجل الأخطاء من السجل. أيضًا ، لا يوجد شيء خارق للطبيعة - نحن فقط نجمع سجل الأخطاء كل ثلاث ساعات ، ونرسلها إلى البريد ، ونراجعها بشكل دوري. هذا يساعد على رؤية المشاكل الشائعة ونوع من المواقف الاستثنائية. ليس من الصعب قراءة بريدك وتعقب الأخطاء وإصلاحها بسرعة. لكن هذا يتيح لك تحديد المشكلات التي يمكن أن تنمو مع نمو قواعد البيانات وحلها بسرعة.

نقطة أخرى مهمة - تأكد من منح المستخدم فرصة "تقديم شكوى". إنه يحسن مكانتنا في أعينهم وينقذنا. هناك مستخدمون ، كما نسميهم ، "هستيريون" يبدأون ، عند أدنى خطأ ، في إرسال مجموعة من الرسائل إلينا في البريد لا تعمل شيئًا ، ولا يتم تحميل قاعدة البيانات ، وكل شيء سيء للغاية. لكن في بعض الأحيان ينقذونا حقًا ، لأنهم في بعض الأحيان يجدون مثل هذه الأخطاء التي لم يعثر عليها الآخرون بأعجوبة ، وهي أخطاء خطيرة.

لا يمكن أن يخاف المستخدم. ليست رسائل مخيفة ، ولا شيء غير ذلك. إنهم بحاجة إلى شرح كل شيء بشكل جميل وعرض الشكوى. ونعد بحل كل شيء. ثم يسعد المستخدمون ، لأنهم يرون أنه يتم الاعتناء بهم ، ويعتقدون على الفور أنه سيتم مساعدتهم :)

تمت كتابة هذه المقالة بناءً على نتائج التقرير الذي تمت قراءته في مؤتمر INFOSTART EVENT 2016 DEVELOPER. يمكن قراءة المزيد من المقالات.

في عام 2020 ، ندعو الجميع للمشاركة في 7 لقاءات إقليمية ، بالإضافة إلى ذكرى INFOSTART EVENT 2020 في موسكو.