استراحت در مقابل GRPC در پایتون: یک معیار عملی!

همیشه تعجب کرده اید: “آیا GRPC واقعاً سریعتر از استراحت است؟” بیایید فقط اعتیاد به مواد مخدره را باور نکنیم. بیایید خودمان را اندازه گیری کنیم!
در این وبلاگ ، ما خدمات استراحت و GRPC کوچک را در پایتون ایجاد خواهیم کرد ، آنها را معیار می کنیم و عملکرد دنیای واقعی آنها را مقایسه می کنیم.
استراحت در مقابل GRPC: مقدمه سریع
نشان | استراحت (فلاسک) | GRPC (protobuf) |
---|---|---|
پروتکل | HTTP/1.1 | http/2 |
قالب داده ها | JSON (متن) | protobuf (باینری) |
قابل خواندن انسان؟ | بله | هیچ |
سرعت | کندتر | سریعتر |
پشتیبانی جریان | سخت | بومی |
تنظیم: ساخت دو سرویس ساده
1. سرور API REST (FLASK)
# rest_server.py
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/hello', methods=['POST'])
def say_hello():
data = request.json
name = data.get('name', 'World')
return jsonify({'message': f'Hello, {name}!'}), 200
if __name__ == '__main__':
app.run(port=5000)
2. سرور GRPC (پایتون)
ابتدا خدمات خود را با استفاده از بافرهای پروتکل تعریف کنید.
سلام .proto
syntax = "proto3";
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
فایل های پایتون را تولید کنید:
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. hello.proto
سرور GRPC:
# grpc_server.py
import grpc
from concurrent import futures
import hello_pb2
import hello_pb2_grpc
class HelloService(hello_pb2_grpc.HelloServiceServicer):
def SayHello(self, request, context):
return hello_pb2.HelloResponse(message=f"Hello, {request.name}!")
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
hello_pb2_grpc.add_HelloServiceServicer_to_server(HelloService(), server)
server.add_insecure_port('[::]:50051')
server.start()
server.wait_for_termination()
معیار: چگونه اندازه گیری کنیم؟
ما ارسال خواهیم کرد 1000 درخواست به هر سرور و اندازه گیری زمان کل را اندازه گیری کنید.
مشتری معیار استراحت
import requests
import time
def benchmark_rest():
url = "http://localhost:5000/hello"
data = {"name": "Ninad"}
start = time.time()
for _ in range(1000):
response = requests.post(url, json=data)
_ = response.json()
end = time.time()
print(f"REST Total Time: {end - start:.2f} seconds")
if __name__ == "__main__":
benchmark_rest()
مشتری معیار GRPC
import grpc
import hello_pb2
import hello_pb2_grpc
import time
def benchmark_grpc():
channel = grpc.insecure_channel('localhost:50051')
stub = hello_pb2_grpc.HelloServiceStub(channel)
start = time.time()
for _ in range(1000):
_ = stub.SayHello(hello_pb2.HelloRequest(name="Ninad"))
end = time.time()
print(f"gRPC Total Time: {end - start:.2f} seconds")
if __name__ == "__main__":
benchmark_grpc()
نتایج: آنچه من مشاهده کردم
متریک | استراحت | GRPC |
---|---|---|
کل زمان (1000 req) | 15-20 ثانیه | 3-5 ثانیه |
تأخیر/درخواست AVG | 15-20 میلی ثانیه | 3-5 میلی ثانیه |
اندازه بار | بزرگتر (متن) | کوچکتر (باینری) |
GRPC حدود 4-5 برابر سریعتر از استراحت بود در این تست کوچک!
چرا GRPC سریعتر است؟
- کاربردهای http/2: چند برابر جریان چندگانه.
- پروتوبولهای دودویی: کوچکتر ، سریعتر برای سریال سازی/deserialize.
- ارتباط مداوم: هیچ تماس 3 طرفه TCP در هر تماس.
پایان
- اگر در حال ساخت هستید API های جلو (مرورگرها/برنامه های تلفن همراه) -> استراحت هنوز عالی است
- اگر در حال ساخت هستید خدمات میکروسروس داخلی در مقیاس -> GRPC می درخشد
جایزه: ابزارهای معیار پیشرفته
فکر نهایی:
مهندسان واقعی عملکرد را حدس نمی زنند – آنها آن را اندازه می گیرند!
معیار مبارک! 💪
آیا دوست دارید افکار خود را بشنوید – آیا قبلاً GRPC را امتحان کرده اید؟ چگونه برای شما پیش رفت؟ احساس راحتی کنید تا در نظرات به اشتراک بگذارید! 🚀