برنامه نویسی

استراحت در مقابل 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 را امتحان کرده اید؟ چگونه برای شما پیش رفت؟ احساس راحتی کنید تا در نظرات به اشتراک بگذارید! 🚀

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا