API แบบอะซิงโครนัส โดยใช้ Flask, Celery และ Redis

API แบบอะซิงโครนัส ในขณะที่เทคโนโลยีของเราก้าวหน้า ความซับซ้อนก็เพิ่มขึ้นทุกวัน ความซับซ้อนใหม่อย่างหนึ่งคือการจัดการงานแบบอะซิงโครนัสด้วย API สมมติว่าแอปพลิเคชันของคุณต้องใช้การคำนวณพื้นหลังเป็นจำนวนมาก แทนที่จะให้ผู้ใช้รอหน้า UI ที่ว่างเปล่า ปลายทาง API แบบอะซิงโครนัสสามารถทำงานเบื้องหลังและแจ้งให้ผู้ใช้ทราบเมื่องานเสร็จสมบูรณ์

กระบวนการแบบอะซิงโครนัสไม่เพียงแต่ปรับปรุงประสบการณ์ผู้ใช้เท่านั้น แต่ยังช่วยให้คุณจัดการโหลดของเซิร์ฟเวอร์ได้ค่อนข้างดี ลองนึกภาพสถานการณ์ต่างๆ ที่เกี่ยวข้องกับเว็บแอปขนาดยักษ์ที่สร้างบน REST API มาตรฐานโดยไม่ต้องทำมัลติเธรด ไม่มีการซิงค์ และไม่มีคิวงาน จะเกิดอะไรขึ้นเมื่อจู่ๆ แอปพลิเคชันมีผู้ใช้ 50,000 ราย ทุกคนต้องการให้ระบบดำเนินการกระบวนการที่ซับซ้อนและใช้เวลานาน หากไม่มีระบบประปาที่เหมาะสม แอปพลิเคชันอาจประสบปัญหาการหยุดทำงานได้อย่างง่ายดาย

ด้วยการจัดการการสื่อสารแบบอะซิงโครนัส คุณสามารถปรับปรุงประสบการณ์ผู้ใช้ จัดกำหนดการงาน และจัดการคำขอที่เกิดขึ้นพร้อมกันจำนวนมากได้ แน่นอนว่า API แบบอะซิงโครนัสไม่เหมาะสำหรับสถานการณ์แบบเรียลไทม์หรือเมื่อต้องดำเนินการตามลำดับ

การพัฒนา API แบบอะซิงโครนัสอาจเป็นเรื่องยาก แล้วเราต้องสร้างอะไร? มันจะต้องการบางอย่างที่สามารถทำมัลติเธรด งานในคิว และทำฟังก์ชันอื่นๆ บางอย่างได้ บทช่วยสอนนี้สาธิตวิธีสร้าง API แบบอะซิงโครนัสด้วย Flask และเทคโนโลยีเพิ่มเติมบางอย่าง เช่น Celery, Redis, RabbitMQ และ Python

  • Celery : Celery เป็นตัวจัดการงานแบบอะซิงโครนัสที่ให้คุณเรียกใช้และจัดการงานในคิว ส่วนใหญ่จะใช้สำหรับงานตามเวลาจริง แต่ยังช่วยให้คุณกำหนดเวลางานได้ มีสามองค์ประกอบหลักใน Celery: ผู้ปฏิบัติงาน นายหน้า และคิวงาน
  • RabbitMQ : RabbitMQ เป็นโปรแกรมรับส่งข้อความที่ใช้สื่อสารระหว่างพนักงานและ Celery สามารถใช้กับแชทบอทได้อย่างอิสระเช่นกัน

ตอนนี้มาตั้งค่า API แบบอะซิงโครนัสของเราโดยใช้ Flask:

ขั้นตอนที่ –1: ข้อกำหนดเบื้องต้น:

  • ความรู้เกี่ยวกับงูหลาม
  • RabbitMQ
  • เซิร์ฟเวอร์ Redis

ขั้นตอนที่ –2: การตั้งค่าสภาพแวดล้อมและการติดตั้งซอฟต์แวร์

ตอนนี้เปิดเทอร์มินัล มาสร้างโฟลเดอร์ใหม่ flaskelry แล้วเปิดมัน:

mkdir flaskelry
cd flaskelry

เมื่อคุณอยู่ในโฟลเดอร์แล้ว ให้เริ่มต้นสภาพแวดล้อมเสมือน:

virtualenv .

เมื่อเสร็จแล้ว ให้ทำซ้ำแท็บเทอร์มินัลสองครั้ง คุณจะต้องเปิดแท็บแยกกันสามแท็บ เนื่องจากเราจะต้องใช้งานเซิร์ฟเวอร์ที่แตกต่างกันสามตัว

ตอนนี้มาติดตั้งเครื่องเล่นหลักตัวแรกของเรา RabbitMQ:

brew update
brew install rabbitmq

หมายเหตุ: คำสั่งดังกล่าวจะทำงานบน Mac เท่านั้น หากคุณมีระบบปฏิบัติการอื่น คุณสามารถรับ RabbitMQ ได้จากที่นี่

เมื่อเสร็จแล้วให้ติดตั้ง Flask และ Celery ด้วย:

python3 -m pip install celery
python3 -m pip install flask

เราตั้งค่าเสร็จแล้ว มาเริ่มเขียนโค้ดกันเลย:

ขั้นตอนที่ –3: การตั้งค่า API

ตอนนี้สร้างไฟล์ api.py และวางโค้ดด้านล่างลงในไฟล์:

from flask import Flask, request, jsonify
import json
import os
import sys
from celery import Celery, Task, current_app
import fns as cad

api = Flask(__name__)
celerymq = Celery('tasks', backend= 'rpc://', broker='pyamqp://guest@localhost//')
class CeleryApiTask(Task):
    def on_failure(self, exc, task_id, args, kwargs, einfo):
        print('{0!r} failed: {1!r}'.format(task_id, exc))
    def on_success(self, retval, task_id, args, kwargs):
        print('{0!r} success!: {1!r}'.format(task_id, retval))

@celerymq.task(base=CeleryApiTask)
def async_cron_alert():
    output = cad.alert_daily()
    return output

@api.before_request
def before_request():
    if request.method=='OPTIONS':
        return jsonify({}), 200
  
@api.errorhandler(500)
def internal_error(error):
    return jsonify({"msg": "Internal Server Error", "status": 500}), 500

@api.errorhandler(400)
def bad_request(error):
    return jsonify({"msg": "Bad Request", "status": 400}), 400

@api.errorhandler(404)
def not_found(error):
    return jsonify({"msg": "Not Found", "status": 404}), 404
    
@api.route("/api/cron_alert_daily/", methods=['GET'])
def route_alert_daily():
    task = async_cron_alert.delay()
    return jsonify({'msg': 'process started', 'task_id': task.id, 'status': 202}), 202
    
if __name__ == "__main__":
    api.run(host='0.0.0.0',port=8124)

คำอธิบายรหัส:

เราได้นำเข้าแพ็คเกจที่จำเป็นทั้งหมด เช่น Flask, Celery, Task, os, json, sys ในห้าบรรทัดแรก หลังจากนั้น เราได้สร้างแอพ Flask และเริ่มการเชื่อมต่อ RabbitMQ กับ Celery

จากนั้น เราได้สร้างคลาสที่ใช้สร้างงาน หลังจากนั้น เราได้กำหนดฟังก์ชัน async async_cron_alert() ซึ่งเป็นแบบอะซิงโครนัส

เพื่อจัดการกับข้อผิดพลาดของเซิร์ฟเวอร์ เราได้กำหนดerror handler() ฟังก์ชัน บางอย่างไว้ด้วย

สุดท้าย เรามีจุดปลาย API /api/cron_alert_daily/ ซึ่งเรียกใช้ฟังก์ชัน async ที่เราสร้างขึ้นด้านบนและตอบสนองด้วย202.

ตอนนี้สร้างไฟล์เพิ่มอีกหนึ่งไฟล์ fns.py และวางโค้ดด้านล่าง:

import time

def async_daily():
    time.sleep(50)
    return "New Job"

คำอธิบายรหัส:

นี่เป็นโมดูลที่ง่ายมากที่จะพักเป็นเวลา 50 วินาที

ขั้นตอนที่ –4: ทดสอบ API

จำได้ไหมว่าเราบอกคุณให้ทำซ้ำแท็บของเทอร์มินัลของคุณ? เราจะใช้มันที่นี่ ไปที่อีกสองแท็บและเรียกใช้คำสั่งด้านล่างในแต่ละเทอร์มินัลตามลำดับ:

ในแท็บเดียว ให้รันคำสั่งนี้:

/usr/local/sbin/rabbitmq-server

บนแท็บอื่น ให้รันคำสั่งนี้:

source bin/activate
celery -A api worker --loglevel=INFO

ไปที่แท็บเทอร์มินัลแรกและใช้คำสั่งด้านล่างเพื่อเรียกใช้เซิร์ฟเวอร์ Flask:

export FLASK_APP=api.py
flask run

ตอนนี้เมื่อทุกอย่างทำงานได้ดีแล้ว ให้เปิดเครื่องมือทดสอบ API ที่เราโปรดปรานแล้วกด URL นี้:

http://127.0.0.1:5000/api/async_newfunction

หากทุกอย่างเรียบร้อยดี คุณควรได้รับคำตอบดังนี้:

{
    "msg": "a new process started",
    "status": 202,
    "task_id": "4845e5f9-7521-43f0-b457-b8b90c73827f"
}

ธาดา!!!! คุณ API พร้อมแล้ว

คำพูดสุดท้าย:

คุณสามารถใช้ API นี้เพื่อสร้างปลายทาง API แบบอะซิงโครนัสได้ ฉันจะไม่แนะนำให้สร้างจุดปลาย async เพื่อใช้งานทุกที่ ฉันหมายถึง มีบางสถานการณ์ที่คุณต้องการการตอบสนองทันทีจาก API ตัวอย่างเช่น คุณไม่ต้องการเพิ่มการหน่วงเวลาในแบบฟอร์มการเข้าสู่ระบบใช่ไหม

การใช้ Celery ยังช่วยให้คุณจัดกำหนดการงานที่คุณสามารถใช้ในสถานการณ์ต่างๆ เช่น การส่งอีเมลจำนวนมาก คุณสามารถสร้างคิวงานของอีเมลและส่งอีเมลทีละรายการได้ มีหลายสิ่งที่จะครอบคลุมใน API แบบอะซิงโครนัส และนี่เป็นเพียงจุดเริ่มต้น คุณสามารถสร้างแอปพลิเคชันที่ซับซ้อนได้อย่างง่ายดายโดยใช้ API นี้ เมื่อคุณเข้าใจวิธีการทำงานของ API แล้ว

ทั้งนี้บริษัทเคแอนด์โอ จึงได้มุ่งเน้นการจัดการแก้ไขปัญหา จัดการเอกสาร ด้านเอกสารขององค์กรมาอย่างยาวนาน และ ให้ความสำคัญกับด้านงานเอกสาร ต่อลูกค้าเป็นอย่างดี จนถึงปัจจุบันก็ได้ความยอมรับจากองค์กร ขนาดใหญ่ ขนาดกลาง และขนาดเล็กมากมาย จึงใคร่ขออาสาดูและปัญหาด้านเอกสารให้กับองค์กรของท่านอย่างสุดความสามารถ เพราะเราเป็นหนึ่งในธุรกิจ ระบบจัดเก็บเอกสาร ที่ท่านไว้ใจได้

สอบถามได้สบายใจทั้ง เรื่องค่าบริการ ราคา และ งบประมาณ เพราะเป็นราคาที่สุด คุ้มที่สุด

เรามีแอดมินคอยคอบคำถาม 24 ชั้วโมงที่ Line OA ให้คำปรึกษาด้านวางระบบจัดการเอกสารอิเล็กทรอนิกส์  EDMS โดยทีมงานผู้เชี่ยวชาญจาก K&O

ที่มีประสบการณ์มากว่า 15 ปี รวมถึงซอฟต์แวร์ระดับโลก ติดต่อ 0 2 – 8 6 0 – 6 6 5 9 หรือ E m a i l : c s @ k o . i n . t h

หากท่านมีความสนใจ บทความ หรือ Technology สามารถติดต่อได้ตามเบอร์ที่ให้ไว้ด้านล่างนี้
Tel.086-594-5494
Tel.095-919-6699

Related Articles