首页 > 解决方案 > 用于服务发现性能考虑的 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 集群中作为守护程序集运行,其他微服务也在其中运行。

标签: pythonpython-3.xsocketsnetworkingservice-discovery

解决方案


推荐阅读