Socket Broadcast с UDP-протоколом для оценки производительности обнаружения служб - PullRequest
0 голосов
/ 06 июня 2019

Я строю небольшой микросервис, который выполняет одну конкретную работу и должен быть 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 как Daemonset, где работают и другие микросервисы.

...