Bagaimana saya bisa mengatur pelanggan utama dan failover MQTT untuk antrian pekerjaan dengan AWS IoT?

11

Saya memiliki sistem di mana klien (sebut saja ClientA) dapat mempublikasikan permintaan ke topik MQTT tertentu. Pialang, jika penting, adalah Amazon Web Services. Lalu saya punya klien lain (sebut saja MainSubscriber) yang selalu berlangganan ke topik yang sama sehingga bisa mengambil permintaan dari ClientA dan melakukan beberapa pekerjaan yang, pada akhirnya, berubah menjadi operasi basis data. Basis data, jika penting, adalah DynamoDB.

Karena MainSubscriber mungkin tidak selalu dapat diakses / online, ada keinginan untuk memiliki pelanggan failover untuk menjadi cadangan failover dari pelanggan utama. Idenya adalah bahwa jika pelanggan utama tidak menangani permintaan pada waktu yang tepat, maka pelanggan failover akan memulai dan melakukan operasi pekerjaan / basis data yang setara. Tantangannya adalah bahwa "pekerjaan" dan "operasi basis data" yang dihasilkan tidak boleh diduplikasi oleh pelanggan utama dan pelanggan yang gagal.

Berikut ini adalah gambar arsitektur sistem logis untuk sistem ini.

                   -----> MainSubscriber ----
                  /                          \
ClientA --> Broker                            ---> Database
                  \                          /
                   ---> FailoverSubscriber --

Jelas, ada beberapa tantangan dengan sistem seperti itu:

  1. Bagaimana pelanggan utama menunjukkan kepada pelanggan failover bahwa itu berfungsi atas permintaan?
  2. Bagaimana pelanggan failover mendeteksi bahwa pelanggan utama belum mengambil permintaan dan perlu mulai mengerjakannya?
  3. Bagaimana cara pelanggan failover menahan pelanggan utama jika tiba-tiba kembali online dan menerima permintaan?
  4. Bagaimana cara menangani masalah sinkronisasi antara pelanggan utama dan pelanggan yang gagal?

Saya lebih suka tidak perlu menemukan kembali roda jika solusi yang ada sudah ada untuk skema seperti itu. Jadi, pertanyaan pertama saya adalah apakah sudah ada sesuatu di luar sana?

Jika tidak, maka saya berpikir untuk menggunakan DynamoDB dengan membaca Sangat Konsisten untuk bertindak sebagai mediator antara pelanggan Utama dan Failover. Jadi, pertanyaan kedua saya adalah apakah ada skema mapan untuk melakukan ini?

Paul Grinberg
sumber
Sudahkah Anda menyelidiki apakah antrian pesan seperti Amazon SQS mungkin bermanfaat di sini? Tampaknya memiliki integrasi dengan AWS IoT dan terlihat cocok untuk masalah gaya 'antrian kerja'.
Aurora0001

Jawaban:

8

Menurut Dokumentasi AWS SQS (seperti yang Anda katakan, broker adalah AWS) ini harus asli:

Segera setelah pesan diterima, ia masih berada dalam antrian. Untuk mencegah konsumen lain dari memproses pesan lagi, Amazon SQS menetapkan batas waktu visibilitas, periode waktu di mana Amazon SQS mencegah komponen konsumen lainnya menerima dan memproses pesan.

Masalahnya adalah menemukan batas waktu visibilitas yang tepat sesuai dengan waktu pemrosesan maksimum Anda.

Anda masih memiliki peluang kecil, baik pelanggan memproses pesan yang sama, dalam hal ini kode pelanggan Anda harus mencoba untuk membuat output idempoten untuk database (setidaknya kunci utama yang sama) dan harus menangani kegagalan gagal ketika mencoba untuk memasukkan catatan yang sama.

Tensibai
sumber
7

Anda mungkin ingin melihat konsep dead-letter queue AWS SQS . Dari dokumen AWS:

Antrian surat mati adalah antrian yang antrian lainnya (sumber) dapat menargetkan untuk pesan yang tidak dapat diproses (dikonsumsi) berhasil. Anda dapat menyisihkan dan mengisolasi pesan-pesan ini dalam antrian surat mati untuk menentukan mengapa pemrosesan mereka tidak berhasil.

Jadi, jika Anda mengarahkan pelanggan utama untuk mendengarkan dari antrian normal dan pelanggan sekunder untuk mendengarkan dari antrian huruf mati, masalah failover harus diselesaikan.

Juga, dengan ini, 1, 2 dan 3 masalah Anda diatasi. Pelanggan utama dan sekunder tidak perlu berbicara satu sama lain dalam hal ini.

Selain itu, berdasarkan jawaban Tensibai, pastikan kode pelanggan Anda ditulis untuk menerima satu pesan sekaligus jika beberapa pelanggan mendengarkan antrian yang sama karenavisibility timeout


Kelemahannya adalah bahwa hal itu akan menyebabkan penundaan dalam pemrosesan, pesan masuk ke antrian surat mati hanya setelah beberapa saat.

Jadi, jika Anda tidak menginginkan itu, maka Anda dapat melanjutkan dengan jawaban Tensibai. Dan jika Anda bisa mentolerir itu, alih-alih memiliki tabel Dynamo tambahan untuk pemeriksaan status, maka Anda dapat menggunakan ini.

Dawny33
sumber