RabbitMQ Quickstart

Ryu·2022년 5월 3일
0

2020-archive

목록 보기
5/7

2020년에 작성한 노트를 옮긴 것입니다.

로컬 설치

#!/bin/sh

## If sudo is not available on the system,
## uncomment the line below to install it
# apt-get install -y sudo

sudo apt-get update -y

## Install prerequisites
sudo apt-get install curl gnupg -y

## Install RabbitMQ signing key
curl -fsSL https://github.com/rabbitmq/signing-keys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo apt-key add -

## Install apt HTTPS transport
sudo apt-get install apt-transport-https

## Add Bintray repositories that provision latest RabbitMQ and Erlang 21.x releases
sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list <<EOF
## Installs the latest Erlang 22.x release.
## Change component to "erlang-21.x" to install the latest 21.x version.
## "bionic" as distribution name should work for any later Ubuntu or Debian release.
## See the release to distribution mapping table in RabbitMQ doc guides to learn more.
deb https://dl.bintray.com/rabbitmq-erlang/debian bionic erlang
deb https://dl.bintray.com/rabbitmq/debian bionic main
EOF

## Update package indices
sudo apt-get update -y

## Install rabbitmq-server and its dependencies
sudo apt-get install rabbitmq-server -y --fix-missing

Web Managemetn Plugin 설정

sudo rabbitmq-plugins enable rabbitmq_management

then go to http://localhost:15672, login with guest/guest 

개념

Virtual host

  • Apache의 Virtual host와 같다.
    • 하나의 서버가 여러개의 도메인을 가지고 있고, 각 도메인마다 다른 서비스를 하고 싶을 때
    • 서버 IP가 123.123.123.123일때, a.com으로 접속하면 A 서비스로, b.com으로 접속하면 B 서비스로 접속됨.
    • 포트기반으로도 가능 (마치 포트포워딩처럼)
  • 하나의 RabbitMQ안에서 사용중인 application 분리
  • User마다 다른 환경을 사용하도록 설정할 수 있다 (one user to many vhosts)
  • 유저 생성 후, virtual host 만들고, 클릭하여 접근 가능한 유저를 추가한다.

Connection

  • 물리적인 TCP connection. 기본적으로 TLS 사용
  • 하나의 커넥션이 약 100kb of RAM 사용. Long-lived connection 맺어야 하고 사용 후 반드시 close해서 server의 리소스 릴리즈해줘야.
  • 한번에 몇개 커넥션 가능? file handler 설정해라

Channel

  • Multiplex. 하나의 물리적인 connection안에서 생성되는 가상의 connection
  • Multi-threads / processes 환경에서 각 채널을 만들고 share하지 않는 방식으로 사용. Cagnnel is not thread-safe.
  • consumer의 프로세스가 각자의 channel을 통해 큐에 연결 → 그러니까 mq connection 인스턴스 만들어도 channel 또한 만들어줘야함
  • Pub할때마다 만들지 말아라

Much like connections, channels are meant to be long lived. That is, there is no need to open a channel per operation and doing so would be very inefficient, since opening a channel is a network roundtrip.

  • Publisher와 Consumer의 채널을 나눠라.
    • Pub이 엄청 많을 때 RabiitMq가 back pressure
    • 이때 cunsumer가 같은 채널쓰고있다면, ACK 처리 안될 수 있음

Queue

  • RPC를 위해선 temporary queue를 사용하지만 queue 종료는 명시적으로 해주는게 좋다.
  • HOW?
    • Exclusive queues
      • 오직 해당 커넥션에서만 사용 가능. 다른 커넥션에서 이 큐 사용하는 경우 RESOURCE_LOCKED 예외.
      • 해당 커넥션이 closed되거나 gone일 때 큐 삭제됨.
    • TTLs
      • time-to-live나 queue length limit 설정 가능
    • Auto-delete queues
      • default: auto_delete = true. 마지막 consumer가 취소되거나, 채널, 커넥션이 끊기는 경우.
      • 만약 cumsumer가 없었을 경우, 삭제되지 않음. ex) all consumption happens using the basic.get

0개의 댓글