ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Rabbitmq 와 swift 통신하기
    카테고리 없음 2024. 1. 31. 16:55

    rabbitmq 를 알게된 동기부터 이글을 시작하고싶다. rabbitmq 의 시작은 아버지의 권유로 시작됬다. 아버지가 관리하는 서버에서 휴대폰을 클라이언트로한 데이터 관리 시스템이 있었는데 안드로이드로 구현을 하고 계셨고 몇일동안 고생하시면서 개발하는 모습을 봤었다. 

    내가 도움이 되기위해 주변에 물어봤는데 답은 알지 못했고 그렇게 몇일 후 나에게 swift 로 통신을 한번 해보라고 말씀을 하셨다. 공식문서로 접근을 처음 하였는데 다른 언어들은 너무 깔끔하게 소스만 복사하면 되고 다른 사람들도 많이 실행해본 블로그나 관련 자료들이 정말 많았다. 하지만 이 swift 녀석만이 유일하게 공식문서가 뭔가 부족했고 어떻게 사용하는지 정말 하나도 모르겠었다. 이렇게 3일간의 삽질이 시작 됬다.

     

    1.rabbitmq 가 그래서뭔데?

    rabbitmq란 한 마디로 정의를 하자면 브로커다.

    일단 기본적으로 서버와 클라이언트를 구성하는 소켓통신인거고 그럼 여기서 문제점이 생기던것은 클라이언트가 많아지거나 예외 사항이많아지게 된다면 기본 소켓통신에서는 그 예외를 모두 처리해줬어야하고 또한 안정성도 떨어졌다. 그러기에 요즘 많이 사용하고 있는 카프카라는 브로커도 rabbitmq 와 같은 브로커 프로그램이다 . 결국 클라이언트와 서버사이에서 브로커역할을 해주며 트래픽이나 데이터관리를 편리하게 해주는것이 rabbitmq 이다.   컨슘 방식에 대한 이야기는 다른 블로그를 참고하는게 더 도움이 될것같다. 나는 아무도없었던 swift 에 대한 자료로 오늘 포스팅을 대신할것이다.

     

    2. 힘들었던거 찡찡거리기

    이렇게 스택오버플로우나 rqbbitmq 정식깃에 가서도 많이 물어봤는데 그렇다할 답변이 나오지않았다. 솔직히 몇일간 좀 힘들었다. 

    그래서 결국 개념을 이해하는것을 우선시했고 코드 한줄씩에 대한 의미를 모두 알아보았다. 

     

    그렇게 통신이 완료되었다. 

     

    처음에는 소스코드에 대한 확신이없어서 서버측과 통신을 계속 보내고 확인할수밖에 없었는데 아무리 생각해도 소스코드가 틀리지않았었다는걸 알게된건 내가 로컬에서 확인 해보

    았을때 알 수 있었다. 맥에서 rabbitmq 웹콘솔을 띄워보고  로컬에서 직접확인해보았다.

    이렇게 계속 메세지큐가 로컬에서만 생기던것이였다, 난 분명히 서버측 정보를 전달을 했는데.... 라고 생각했고 호출 스트림도 이상하지않았는데. 생각을 하다가 일단 아버지께서 주신 팁은 iOS 에서는 Https 를 제외한 통신을 항상 닫아놓는(보안때매)기능이 있는데 일단 그걸 열라고 하셔서 열고 나서 소스코드에서도 내가 커넥션을 만들고 그안에다가 uri 를 설정하지를않아서 계속 로컬에만 들어갔던것이였다. 

    그렇기에 흐름은 진행되는데 넣을곳이 없어서 로컬에만 계속 들어갔던것이였다. 그래서 이제 여기에 uri 를 넣어주고 돌려보았는데.. 드디어 서버와 통신성공 내가 보낸 메세지가 그대로 나한테 잘 들어왔다.!

     

    자 이렇게 나의 삽질 기록을 최대한 잘 정리해보았다. 이제 그럼 실행 가능한 코드를 제공하겠다 

     

    import RMQClient
    import Foundation
    import RMQClient
    import UIKit
    import CocoaAsyncSocket
    import UIKit
    import RMQClient
    import UIKit
    import RMQClient
    
    
    
    class ViewController: UIViewController {
        @Published var company : String = ""
    
    
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
          
    
            
                self.receiveLogs(company: "yangcompany1")
                self.receiveLogs(company: "yangcompany1")
                sleep(1)
                self.emitLog(company: "yangcompany1")
            
            
            
        }
            func createConnection() -> RMQConnection {
    
    
                let uri = "secure"
                let delegate = RMQConnectionDelegateLogger()
                let connection = RMQConnection(/*uri:uri,*/delegate: delegate)
                return connection
            }
        
        func emitLog(company : String) {
            
            let conn = createConnection()
            conn.start()
            let ch = conn.createChannel()
            let x = ch.fanout("logs")
            let msg = "Hello World!"
            let q = ch.queue(company)
            ch.defaultExchange().publish(msg.data(using: .utf8)!,routingKey: q.name)
            
            
    //        x.publish(msg.data(using: String.Encoding.utf8)!)
            print("Sent \(msg)")
           // conn.close()
        }
    
        func receiveLogs(company : String) {
            let conn = createConnection()
            conn.start()
            let ch = conn.createChannel()
            
            let x = ch.fanout("logs")
            let q = ch.queue(company)
            q.bind(x)
            print("Waiting for logs.")
            
            q.subscribe({(_ message: RMQMessage) -> Void in
                print("Received \(String(data: message.body, encoding: String.Encoding.utf8)!)")
            })
            
    
        }
        
       
    }

     

    이소스를 사용해서 uri 부분에 형식만 잘 맞춰서 보내주면 이쁘게 메세지 큐가 생긴다. 이제 이를 보고 다들 swift의 자료가없는걸로 고통받지말자 . 내가 정말 많은곳에 물어봤단 카카오 오픈방 , 디스코드, 스택오버플로, 깃등등,, 일단 rabbitmq 를 사용해본 사람자체가 많이 없고 이런 자료가 깃에도 정말 아무것도 없다, 공식문서와 개념으로 이해한 코드기 때문에 보고 참고하셨으면 좋겠다.

Designed by Tistory.