Pengamat jarak jauh

Jika proyek melampaui lingkup mesin lokal, kemungkinan besar Anda harus berintegrasi dengan beberapa sistem pihak ketiga.


Saya ingin mempertimbangkan kasus ketika sistem eksternal yang disebutkan di atas ingin menerima pemberitahuan tentang segala perubahan dalam sistem kami. Misalnya, memperbarui katalog produk.


Tugas


Ada platform perdagangan yang menyediakan akses ke basis produknya melalui layanan WEB. Mitra situs ingin mengetahui tentang perubahan dalam basis data sesegera mungkin.


Opsi solusi


Kami tahu semua mitra kami, kami dapat meminta dokumentasi untuk perangkat lunak mereka.


Anda dapat mengimplementasikan pekerjaan dengan API mitra kami, dan saat mengubah katalog produk, beri tahu mereka secara langsung.


Dengan pendekatan ini, setiap klien baru harus terhubung secara individual. Jika mitra telah mengubah sesuatu dalam perangkat lunak, sumber daya akan diperlukan untuk mengembalikan fungsionalitas. Secara umum, biaya tambahan dan zona tanggung jawab ekstra.


Saya benar-benar tidak ingin menjalin ikatan yang begitu ketat. Karena itu, kami akan melakukan hal berikut.


Mari kita ambil pola "pengamat" sebagai dasarnya. Biarkan kolega kami berlangganan acara dan menerima pemberitahuan yang mereka butuhkan.


Penerapan


Catatan berlangganan harus disimpan di suatu tempat. Jenis penyimpanan akan tetap berdasarkan hati nurani pengembang. Pertimbangkan apa yang perlu disimpan.


  • Peristiwa. Mungkin ada banyak jenis acara dan agar tidak mengirim peringatan kepada semua orang, Anda perlu tahu siapa yang berlangganan apa.
  • 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 . , .


Selama pemrosesan permintaan berlangganan, kemungkinan ini dicentang (metode canAddEvent). Itu bisa apa saja, tetapi dalam kasus saya batas jumlah pendengar diperiksa. Tidak lebih dari 3 untuk setiap jenis acara.


Plus, tentu saja, otorisasi diperlukan untuk bekerja dengan metode API tersebut.


Pada dasarnya itu. Opsi paling sederhana dijelaskan. Jika perlu, Anda dapat menambahkan dukungan untuk SOAP atau koneksi soket atau sesuatu seperti itu. Dan Anda perlu mengirim ulang pesan jika responsnya tidak berhasil.


All Articles