API接口(2)
应用层协议
半双工
在C/S架构中典型代表是http,这种一问一答会出现逻辑阻塞,早期常使用轮询来处理有实时响应的任务场景
全双工
主流的长连接方式使用websocket,类似的还有MQTT等协议,解决了轮询在处理实时响应任务时出现的通信延迟问题
API类型
不同风格API的适用场景不同(由请求的数据决定),没有协议的规定严格,与后端服务返回的数据格式(XML、JSON)配合使用,但核心功能还是:基于某种应用层协议的请求报文解析与响应报文封装。
RESTful API
最常见的Web API类型,基于 HTTP/HTTPS 协议,配合JSON数据格式轻量、简单且高度可扩展。
GraphQL API
用于针对数据库中特定数据结构的精确查找,效率高。
gRPC API
常用于微服务架构中的系统间快速通信。
后端异步处理架构
与传统的请求驱动模型不同,让后端不同服务之间解耦合,系统扩展性更好。
事件/消息驱动
本质没有太大差别:
事件驱动使用状态机模型,事件处理完成返回一条状态,开始执行下一个任务;
消息驱动使用订阅模型,事件处理每一步通过消息来管理是否进入下一个服务,过程更细化。
import threading
import time
# 事件生成器
class EventGenerator(threading.Thread):
def __init__(self, event_total):
super(EventGenerator, self).__init__()
self.event_total = event_total
def run(self):
for i in range(self.event_total):
event = {'type': 'event', 'timestamp': time.time(), 'data': i}
event_bus.put(event)
time.sleep(1)
# 事件处理器
class EventHandler(threading.Thread):
def __init__(self, event_total):
super(EventHandler, self).__init__()
self.event_total = event_total
def run(self):
for i in range(self.event_total):
event = event_bus.get()
print(f'处理事件:{event}')
time.sleep(1)
# 事件总线
from queue import Queue
event_bus = Queue()
# 启动事件生成器和事件处理器
event_generator = EventGenerator(10)
event_handler = EventHandler(10)
event_generator.start()
event_handler.start()
# 等待事件处理完成
event_generator.join()
event_handler.join()任务队列
异步处理、存储、调度任务的全生命周期
import threading
import time
# 生产者
class Producer(threading.Thread):
def __init__(self, message_total):
super(Producer, self).__init__()
self.message_total = message_total
def run(self):
for i in range(self.message_total):
message = {'type': 'message', 'timestamp': time.time(), 'data': i}
message_queue.put(message)
time.sleep(1)
# 消费者
class Consumer(threading.Thread):
def __init__(self, message_total):
super(Consumer, self).__init__()
self.message_total = message_total
def run(self):
for i in range(self.message_total):
message = message_queue.get()
print(f'处理消息:{message}')
time.sleep(1)
# 消息队列
from queue import Queue
message_queue = Queue()
# 启动生产者和消费者
producer = Producer(10)
consumer = Consumer(10)
producer.start()
consumer.start()
# 等待消费者处理完成
producer.join()
consumer.join()
💬 评论区