ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Node.js] Redis 사용하여 파이썬 프로세스와 메시지 교환하기 (pub/sub)
    졸업프로젝트 2021. 4. 10. 18:22

     

    화상 회의를 종료하였을 때 회의 채팅 기반으로 분석을 제공해준다.

    기본적인 웹 서버는 node.js로, 분석은 파이썬 스크립트로 코드가 구성되어 있어

    Redis의 메시지 큐를 이용하여 데이터를 송수신하였다.

     

    Redis의 동작 방식은 굉장히 간단하다.

    channel을 구독하고 있는 subscriber에게 publisher가 데이터를 publish 해주는 것이다.

    이때 subscriber는 다수가 될 수 있다.

     

    1. Redis 설치

     

    공식적으로 Redis는 윈도우를 지원하지 않지만, Microsoft open tech 그룹에서 64비트 윈도우에서 사용 가능한 Redis를 오픈해 두었다. 따라서 윈도우 환경인 나는 이 방법으로 Redis를 설치하였다.

    설치 방법은 블로그를 참고하였다.

     

    1-1 다운로드

    깃허브에 올라와있는 파일을 원하는 경로에 다운 받는다.

    [깃허브 주소:  github.com/microsoftarchive/redis/releases]

     

    1-2 서비스 시작

    Redis를 이용하기 위해선 반드시 redis-server가 실행되고 있어야 한다.

    명령창을 켜고 Redis 설치 파일 경로로 이동하여 redis-server를 입력한다.

    아래와 같은 화면이 나온다면 성공적으로 실행된 것이다.

     

     

    나는 이 과정에서 에러가 발생하였다.

     

    [3008] #Creating Server TCP listening socket *:6379: bind: No such file or directory

    혹시 같은 에러가 발생한 사람을 위해 해결 방법을 링크해두겠다.

     

     

     

    2. node.js Redis 사용

     

    먼저 redis 모듈을 설치한다.

     

    >> npm install redis

     

    기본적인 client 생성 코드이다.

    데이터를 송신할 pub과 데이터를 수신할 sub을 생성하였다.

    sub은 server라는 channel을 구독하고 있다.

     

    const redis = require('redis');
    const pub = redis.createClient({
      host:'localhost',
      port: 6379,
      db: 0
    })
    
    const sub = redis.createClient({
      host:'localhost',
      port: 6379,
      db: 0
    })
    sub.subscribe('server');

     

    sub이 server 채널로부터 메시지를 수신하였을 때 실행되는 이벤트이다.

    채널과 메시지 정보를 확인할 수 있고, 

    나의 경우엔 json을 string으로 변환한 것을 메시지로 사용하였다.

    다시 메시지를 json형태로 parse 하여 데이터를 사용해주었다.

     

    메시지 형식: {'tyape' : type, 'data': data} 로 구성하여 type에 따라 다르게 처리되도록 하였다.

     

    sub.on('message', function(channel, message){
      var msg = JSON.parse(message);
      switch(msg.type){
        case 'tags':
          console.log("[태그] "+ msg.data);
          break;
        case 'wordcloud':
          console.log("[WC] "+ msg.data);
          break;
        case 'summary':
          console.log("[요약] "+ msg.data);
          break;
      }
    })

     

    파이썬 프로세스로 메시지를 송신하고 싶을 때는

    파이썬 쪽에서 구독 중인 analysis_channel을 이용하여 텍스트 데이터를 보낸다.

     

    pub.publish('analysis_channel', contentInput);

     

    [참고] 도움이 많이 되었다.

     

     

     

    3. python Redis 사용

     

    마찬가지로 먼저 모듈을 설치한다.

     

    >> pip install redis

     

    기본적인 구조이다. node.js와 같은 host, port로 redis를 연결해주게 되면

    자동적으로 두 스크립트가 같은 redis를 이용하게 된다.

    파이썬 코드의 sub은 analysis_channel을 구독하고 있다.

     

    import redis
    
    r = redis.StrictRedis(host='localhost', port=6379, db=0)
    sub = r.pubsub()
    sub.subscribe('analysis_channel')

     

    파이썬 코드는 while문을 이용하여 메시지 정보를 수집한다.

    반복문 안에서 sub이 get_message를 통해 메시지를 받고 그 message가 유효하다면 함수를 실행한다.

     

    message는 json 형태로 data 말고 채널 등 다른 정보도 포함하고 있다.

    도착한 메시지는 b'' 형태로 오게 되어 utf-8로 decode 한 뒤 사용해 주었다.

     

    message가 비어있을 경우에 message ['data']는 1 값이다.

    if문을 사용하여 message의 유효성을 판단하고 원하는 함수를 실행해준다.

     

    while True:       
            message = sub.get_message()
    
            if message:
                print("메시지 수신됨")
                contents = message['data']
                if not contents == 1:
                    contents = contents.decode('utf-8').replace(",", " ")
                    sentences = split_sentences(contents)

     

    파이썬에서 node로 메시지를 송신하는 코드이다.

    json 형태로 만들어진 데이터를 string으로 변환한 뒤에 server 채널로 송신한다.

     

    r.publish('server', json.dumps(result, ensure_ascii=False))

     

     

     

    4. 테스트 하기

     

    4-1. redis-server 실행

    4-2. python script 실행

    4-3 node.js 서버 구동

    4-4 데이터 송수신 확인

    댓글

Designed by Tistory.