Tic Tac Toe, Bagian 6: Labu dan Seledri / RabbitMQ

Tic Tac Toe: Siklus Konten

Mari kita coba hubungkan Celery / RabbitMQ ke proyek kami. Sebagai dasar, ambil proyek dengan Flask . Seledri akan melakukan perhitungan angka acak.


Instalasi Proyek

Kami mengkloning proyek di komputer Anda:


git clone https://github.com/nomhoi/tic-tac-toe-part6.git 

Luncurkan kontainer:


 cd tic-tac-toe-part6 docker-compose up -d 

Kami membangun aplikasi web:


 cd front npm install npm run-script build 

Buka browser di http: // localhost .


Wadah buruh pelabuhan

Layanan nginx tetap tidak berubah. Dalam layanan labu , mereka menambahkan instalasi paket Seledri ke file requirement.txt dan memasang folder dengan sumber proyek Seledri:


  volumes: - ./flask:/code - ./celery/app/proj:/code/proj 

Layanan seledri dan kelinci baru telah ditambahkan .


  celery: container_name: celery build: context: celery/ dockerfile: Dockerfile volumes: - ./celery/app:/app depends_on: - rabbit networks: - backend rabbit: container_name: rabbit hostname: rabbit image: rabbitmq:3.7.15-alpine environment: - RABBITMQ_DEFAULT_USER=admin - RABBITMQ_DEFAULT_PASS=CT2gNABH8eJ9yVh ports: - "5672:5672" networks: - backend 

Layanan seledri

Layanan seledri didasarkan pada tutorial ini . Mereka yang tidak terbiasa dengan Seledri, masuk akal untuk pergi melalui tutorial ini di sini:


 $ docker exec -it celery python Python 3.7.3 (default, May 11 2019, 02:00:41) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from proj.tasks import add >>> add.delay(2, 2) <AsyncResult: 43662174-657f-4dd3-ab1a-22f5950c8794> >>> 

Seperti yang Anda lihat, proyek kami di Celery dirancang sebagai paket proj . Dalam tugas Seledri, tugas getnumber kami telah ditambahkan ke file task.py :


 @app.task def getnumber(): return randrange(9) 

Layanan labu

Biarkan saya mengingatkan Anda bahwa kami menambahkan paket Seledri ke layanan ini dan memasang folder dengan proyek proj . Kode sumber untuk proyek ini sekarang hadir dalam dua layanan, labu dan seledri .


 from flask import Flask, jsonify from proj.tasks import getnumber from proj.celery import app as celery app = Flask(__name__) @app.route('/number') def number(): task = getnumber.delay() return task.id @app.route('/result/<task_id>') def result(task_id): task = getnumber.AsyncResult(task_id) result = task.get(timeout = 3) response = { 'state': task.state, 'number': result, } return jsonify(response) 

Di penangan angka , kami memanggil tugas getnumber , yang berjalan di pekerja seledri , dan mengembalikan pengidentifikasi tugas. Di handler hasil , kami mendapatkan hasil tugas yang diselesaikan oleh pengidentifikasi dan mengembalikan respons dalam format JSON front end.


Frontend

Di pengelola permainan kami, dengan mengklik tombol Dapatkan nomor acak , pertama-tama kami mengirim permintaan ke backend di alamat / nomor dan mendapatkan ID tugas Seledri dari itu. Setelah itu, dalam fungsi getResult , kami secara berkala mengirim permintaan ke backend untuk menerima hasil di alamat / hasil / <task_id> .


 async function getResult(task_id) { var i = 1; var timerId = setTimeout(async function go() { console.log("Result request: " + i); console.log("Task Id: " + task_id) const res = await fetch(`result/` + task_id); const response = await res.text(); if (res.ok) { let result = JSON.parse(response); console.log(result) if (result.state === 'SUCCESS') { let i = parseInt(result.number); if ($status === 1 || $history.state.squares[i]) { promise_number = result.number + ' - busy'; return; } promise_number = i; history.push(new Command($history.state, i)); return; } } if (i < 5) setTimeout(go, 500); i++; }, 500); } 

Mengubah output dari hasil permintaan backend:


 {#await promise} <p>...</p> {:then taskid} <p>Task Id: {taskid}</p> {:catch error} <p style="color: red">{error.message}</p> {/await} {#await promise_number} <p>...</p> {:then number} <p>Number: {number}</p> {:catch error} <p style="color: red">{error.message}</p> {/await} 

PR

Bahkan, sekarang hasilnya datang segera setelah permintaan pertama. Coba agen cerdas kita yang hidup di seledri untuk membuat sedikit berpikir, agar tidak segera memberikan jawaban.


Dari waktu ke waktu suatu kesalahan mulai datang dari labu 'a "500 (INTERNAL SERVER ERROR)", ini menimbulkan pengecualian "selery.exceptions.TimeoutError: Operasi habis waktu." Di seledri . Hanya layanan reboot yang membantu. Meskipun tidak menggali apa yang terjadi, silakan lihat.


GetResult memproses respons hanya dengan status SUKSES, dalam kasus lain, permintaan kedua dibuat. Anda dapat menambahkan penanganan respons dengan FAILURE dan PENDING. Pembentukan respons di handler hasil juga tergantung pada keadaan tugas.


Alih-alih broker pesan RabbitMQ, Anda dapat mencoba menghubungkan Redis.


Anda dapat mencoba menjalankan permintaan dari aplikasi melalui perantara pesan.


Dan juga mencoba melakukannya berdasarkan contoh Boost.Beast.


Repositori GitHub

https://github.com/nomhoi/tic-tac-toe-part6

Source: https://habr.com/ru/post/id461531/


All Articles