مراقب بعيد

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


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


مهمة


هناك منصة تداول توفر الوصول إلى قاعدة منتجاتها من خلال خدمات WEB. يرغب شركاء الموقع في معرفة التغييرات في قاعدة البيانات في أقرب وقت ممكن.


خيار الحل


نحن نعلم جميع شركائنا ، يمكننا طلب وثائق لبرامجهم.


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


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


أنا حقاً لا أريد إقامة مثل هذه العلاقات الضيقة. لذلك ، سنفعل ما يلي.


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


التنفيذ


يجب الاحتفاظ بسجلات الاشتراك في مكان ما. سيبقى نوع التخزين على ضمير المطور. ضع في اعتبارك ما يجب تخزينه.


  • حدث. يمكن أن يكون هناك الكثير من أنواع الأحداث ولكي لا ترسل تنبيهات إلى الجميع ، يجب أن تعرف من اشترك في ماذا.
  • URL. . HTTP- URL. , .
  • . , ( , , ). , . - . .

, PHP.


, POST- URL. , b2b.api.my-soft.ru/event-subscription. URL event( ).


( Laravel):


public function subscribe()
{
    $request = $this->getRequest();
    $eventName = $request->input('event');
    $url = $request->input('callback');

    $validator = \Validator::make([
        'url' => $url,
        'event' => $eventName
    ], [
        'url' => 'url|required',
        'event' => 'required'
    ]);

    if ($validator->fails()) {
        throw new BadRequestHttpException($validator->errors()->first());
    }

    $repository = $this->getRepository();
    if (!$repository->eventAvailable($eventName)) {
        throw new BadRequestHttpException(trans('api.error.eventSubscription.wrongEvent'));
    }

    if (!$repository->canAddEvent($eventName)) {
        throw new BadRequestHttpException(trans('api.error.eventSubscription.maxCallbacks'));
    }

    $model = $repository->createModel([
        'client_id' => $request->attributes->get('client')->id,
        'event' => $eventName,
        'url' => $url
    ]);
    if ($repository->save($model)) {
        return $this->response($model);
    }
    throw new \Exception();
}

:


  • ,
  • ,
  • ( canAddEvent)
  • ,

.


. , . , .. . .


, , .


.


, , . , , .


, . .


$subscribersRepository->with(['event' => $event->getEventName()])->getActive()->each(function ($model) use ($event) {
    $this->dispatch(new \Commands\RemoteCallback(
        $model->id,
        $model->url,
        $event->getData()->toArray()
    ));
});

.


RemoteCallback :


public function handle(EventSubscriptionRepository $subscriptionRepository)
{
    $client = new \Guzzle\Http\Client();
    $res = $client->post($this->url, [], $this->data, ['connect_timeout' => 3, 'timeout' => 3]);
    try {
        if ($res->send()->getStatusCode() !== 200) {
            throw new \Exception();
        }
        $subscriptionRepository->dropErrors($this->subscriptionId);
    } catch (\Exception $e) {
        $subscriptionRepository->incrementError($this->subscriptionId);
    }
}

. POST- URL. , , .


. . HTTP != 200, . , 3 3 . , .


أثناء معالجة طلب الاشتراك ، يتم التحقق من إمكانية ذلك (طريقة canAddEvent). يمكن أن يكون أي شيء ، ولكن في حالتي يتم التحقق من الحد الأقصى لعدد المستمعين. لا يزيد عن 3 لكل نوع من أنواع الأحداث.


بالإضافة إلى ذلك ، بالطبع ، مطلوب إذن للعمل مع أساليب API هذه.


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


All Articles