Redis Pub/Sub

dong5854·2022년 4월 21일
0

Redis Messaging

목록 보기
1/3
import threading
import redis
import time

conn = redis.Redis(host='localhost', port=6379, db=0)

def run_pubsub():

    # publish
    threading.Thread(target=publisher, args=(10, 'test_channel')).start()

    # subscribe
    pubsub = conn.pubsub()
    pubsub.subscribe(['test_channel'])

    while True:
        print("waiting message...")
        res = pubsub.get_message()
        if res is not None:
            print(res)

        time.sleep(0.5)


def publisher(n: int, channel: str):
    time.sleep(1)
    for num in range(n):
        time.sleep(1)
        conn.publish(channel=f'{channel}', message=f'python pub/sub => {num}')


if __name__ == '__main__':
    run_pubsub()

간단한 메세지 큐가 필요해 Redis Pub/Sub에 대해 알아봤다. 위의 코드는 파이썬에서 Redis Pub/Sub을 테스트 할 때 사용한 코드이다.

멀티스레드를 이용해 publish하고 subscribe를 한 것을 print하여 통해 보여주는 코드다.

멀티스레드로 publish한 이유는 Redis Pub/Sub은 rabbitmq나 kafka같은 메세지 큐와 다르게 publish 한 시점에 subscriber가 없으면 데이터가 곧바로 유실된다..

처음에 이 사실을 모르고 테스트 코드를 짰을 때, publish를 멀티스레드를 사용하지 않고 코드를 작성하여 publish가 전부 끝난 후 subscribe를 했는데 publish한 메세지가 아무것도 print 되지 않아 당황했었다.

내가 필요한것은 정말로 간단하고 빠른 메세지 큐였기 때문에 RabbitMQ나 Kafka가 아닌 Redis를 선택한 것이였지만 subscriber가 없으면 바로 데이터가 유실되는 것은 곤란했기 때문에 이를 해결할 방법을 찾던 중 Redis ListRedis Stream으로 메세징을 하는 방법이 있다는 것을 찾아 이 두 방법에 대해서도 알아본 후 가장 적절한 방법을 이용해야 할 것 같다.

Redis의 Pub/Sub은 이번에 사용하기는 조금 부적절했지만 다음에 채팅기능을 구현할 때 유용하게 사용할 수 있을 것 같다.

profile
https://github.com/dong5854?tab=repositories

0개의 댓글