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