[RabbitMQ] 안드로이드에서 RabbitMQ 사용하기 - 1

panax·2021년 12월 5일
0

Android

목록 보기
3/16

개요

공식 홈페이지
오픈소스 메시지 브로커 라이브러리 중 하나로 업무 관련으로 알게 됐다.

안드로이드 앱에서 서버에 데이터를 주기적으로 요청해야 하는 기능을 개발해야 했다.
단순히 레트로핏과 Handler 로 일정 시간마다 서버에 요청을 보낼 수도 있지만, 요청받는 데이터가 생각보다 크고 데이터가 변하지 않았을 때도 요청하기 때문에 리소스 낭비가 발생했다.

RabbitMQ?

RabbitMQ 는 메시지 브로커로 서버와 클라이언트 중간에 위치하면서, 서버가 메시지를 RabbitMQ에 전달하면 RabbitMQ 에 등록된 클라이언트에 메시지를 전달하는 기능을 가지고 있다.

서버 입장에서는 RabbitMQ 에만 메시지를 전달하면 되고, 클라이언트 입장에서는 RabbitMQ 에 등록하기만 하면 되니, 불필요한 네트워크 요청을 줄일 수 있다.

용어

RabbitMQ 를 사용하려면 몇 가지 용어에 대해 알아두는 것이 편하다.

Producer

메시지를 보내는 프로그램

Consumer

메시지를 받는 프로그램

Queue

  • RabbitMQ 에서 메시지가 보관되는 곳
  • 호스트의 메모리와 디스크 용량에 영향을 받음
  • 다수의 Producer 는 하나의 큐에 메시지를 전달할 수 있음
  • 다수의 Consumer 는 하나의 큐에서 메시지를 받을 수 있음

Temporary Queue

  • 일반적으로 서버나 클라이언트에서 큐를 생성하지만, RabbitMQ 에서 큐를 자동 생성할 수 있다.
  • 한번 연결이 끊어지면, 큐가 삭제됨
  • 이름이 자동으로 생성
  • 로그 메시지 등 범용적인 기능을 위해 사용하는 것으로 보임

Exchanges

  • Producer 가 큐에 직접 접근하지 않기 위한 역할
  • exchange 타입에 따라 큐에 메시지를 전달하는 방식이 다르다.
    • direct : 특정 큐를 대상으로 메시지 전송
    • fanout : 모든 큐에 브로드캐스트
    • topic : 특정 패턴을 가진 라우팅 키를 사용해서 해당하는 큐에 전송
    • headers : topic 와 비슷하지만 조건식에 일치하는 큐에 전송
  • 큐와 exchange 를 생성하면 서로 바인딩을 해야 한다.

사용법 요약

Send

  • 연결 생성 → 채널 생성 → 큐 바인딩 → 메시지 publish 설정

Receive

  • 연결 생성 → 채널 생성 → 큐 바인딩 → 메시지 consume 설정
  • 비동기 방식으로 메시지를 받기 때문에 콜백을 만들어야 한다.

Android 적용시 주의 사항

  • 네트워크 작업이라 excutor, handler 등 백그라운드 작업에서 사용해야 한다.
  • Kotlin 의 경우 코루틴을 사용하면 된다.
  • 안드로이드 스튜디오의 에뮬레이터를 사용하는 경우 localhost 대신 10.0.2.2 또는 10.0.3.2 를 사용해야 된다.

RabbitMQ 설치

공식 다운로드
아래 코드는 RabbitMQ 를 설치해야 실행할 수 있다.
설치와 관리자 페이지에 대한 설명은 나중에 추가할 예정

기본 예시 (안드로이드)

Producer

ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");

try {
	// 서버 연결
	Connection connection = factory.newConnection();

	// 채널 생성
	Channel channel = connection.createChannel();

	// 큐 bind
	channel.queueDeclare(
			"QUEUE 1", false, false, false, null
	);

	// Publish
	String message = "Simple Connection";
	channel.basicPublish("", "QUEUE 1", null, message.getBytes());

	} catch (Exception e) {close();}

connection 과 channel 은 close() 를 사용해서 종료해야 하지만, try-with 문을 사용하면 자동으로 close 를 해준다.

Consumer

// 실패 콜백
CancelCallback cancelCallback = consumerTag -> {};

// 성공 콜백
DeliverCallback deliverCallback = (consumerTag, message) -> {

	String body = new String(message.getBody(), StandardCharsets.UTF_8);
};

먼저 콜백을 설정해야 한다. RabbitMQ 는 비동기 작업이기 때문에 RabbitMQ 에서 보내는 결과에 따라 콜백 함수가 실행된다.
전송이 성공한 경우, 메시지를 보내는데 byte 형태로 전송되기 때문에 변환을 해야 한다.

// 서버 설정
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");

try {
	// 서버 연결
	Connection connection = factory.newConnection();

	// 채널 생성
	Channel channel = connection.createChannel();

	// 큐 bind
	channel.queueDeclare(
		"QUEUE 1", false, false, false, null
	);

	// Consume
	channel.basicConsume(
		"QUEUE 1", true, deliverCallback, cancelCallback
	);

} catch (Exception e) {close();}

Producer 와 거의 동일한 것을 볼 수 있다.

profile
안드로이드 개발자

0개의 댓글