python - 用于服务发现性能考虑的 UDP 协议的套接字广播
问题描述
我正在构建一个小型微服务,它完成一项特定的工作并且需要 HA。我正在考虑实现基于套接字的服务发现。所以我可以有另一个与热备用相同的服务。他们互相交谈以便同步。是的,我可以使用 Redis 或任何其他数据库使它们同步。对于这个特定的服务,我不想依赖其他服务。我想出了这个解决方案,它完全符合我的要求。但是从性能/稳定性的角度来看,我不确定这段代码的风险。我目前不担心安全性。
import socket
import time
import uuid
import struct
instance_id = uuid.uuid4().hex
payload = "this is data"
multicast_group = ('224.31.5.85', 19845)
discovery = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
ttl = struct.pack('b', 1)
discovery.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)
discovery.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
discovery.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
discovery.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
group = socket.inet_aton(multicast_group[0])
mreq = struct.pack('4sL', group, socket.INADDR_ANY)
discovery.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
discovery.settimeout(0.2)
discovery.bind(("", 19845))
while True:
message = "/".join([instance_id, payload]).encode()
# send discovery message
discovery.sendto(message, multicast_group)
# process all other received messages
while True:
try:
data, addr = discovery.recvfrom(1024)
except socket.timeout:
break
else:
rec_instance_id, rec_payload = data.decode().split("/")
if not rec_instance_id == instance_id:
print("received message: {} from {}".format(data, addr))
time.sleep(1)
你怎么看?微服务最终在 Kubernetes 集群中作为守护程序集运行,其他微服务也在其中运行。
解决方案
推荐阅读
- c# - 如何在一个视图中使用两种不同的模型?
- rust - 如何将一个结构解构为另一个包含相同字段的结构?
- swift - 我可以打印数据但不能将其分配给 Swift 中的标签
- camera - 摄像头流(或 IP 摄像头)的扫描仪驱动程序
- c# - 如何使用设置 DataSource、DataPropertyName 将数组字符串绑定到 DataGridView(WinForms)?
- android - Unity Android 应用程序中的麦克风问题
- c++ - C++ 平衡 AVL 树
- javascript - 将href从父组件动态传递给子组件vue.js
- amazon-s3 - 无法使用 CORS 配置访问 S3 资源
- python - TFBertForTokenClassification 在 NER 任务上仅对 O 个标签进行评分