Lignum: 분산 메시지 큐
모든 WFH 퍼즈와 격리된 상황 사이에서 나는 Consul을 사용하여 분산 잠금을 조사하기 시작했습니다. 간단한 테스트 프로그램은 곧 Lignum 이라는 분산 메시지 대기열을 구축하는 경로가 되었습니다 .

이것은 Lignum 메시지 큐에 대한 소개 글입니다.
분산 시스템이란 무엇입니까?
거기에는 많은 정의가 있으며 간단한 Google 검색으로 여러 답변이 나옵니다. 저는 분산 시스템을 공통 목표를 향해 작업하는 자율적 또는 개별 프로그램 또는 시스템의 집합으로 정의할 수 있습니다.
공통의 목적을 달성하기 위해 다양한 통신 수단을 통해 네트워크로 연결되는 여러 시스템을 의미합니다. 하나는 웹 페이지를 요청하고 다른 하나는 웹 페이지를 제공하는 시스템일 수 있습니다. 최종 사용자에게는 이러한 시스템이 하나로 보일 수 있지만 작업을 수행하기 위해 서로 통신하는 수백 개의 시스템이 있을 수 있습니다.
메시지 대기열이란 무엇입니까?
다른 서비스가 FIFO 순서로 메시지를 읽고 쓸 수 있도록 Queue 데이터 구조를 제공하는 시스템입니다.
대기열을 사용하면 생산자 서비스가 메시지를 작성하고 소비자가 비동기적으로 소비할 수 있습니다. 생산자와 소비자는 서로를 알 필요가 없습니다.

메시지 큐의 두 가지 기본 특성은 다음과 같습니다.
- 주제
메시지는 명명된 버퍼로 전송되며 이를 주제라고 합니다. 주제에서 메시지를 생성하고 소비합니다. - 메시지
다른 사용자가 사용할 수 있도록 주제에 작성하는 실제 메시지입니다.
분산 메시지 대기열이란 무엇입니까?
여러 노드에서 호스팅되는 메시지 대기열을 구축할 때 공동으로 작업하여 다른 서비스에 대한 단일 엔터티 역할을 합니다.
제공할 사용자 메시지를 호스팅하는 여러 큐가 있습니다.
- 안정성 및 고가용성
- 결함 허용
- 성능
- 여러 노드와 읽기 로드 공유
Lignum 은 Consul 세션 잠금 을 사용하여 분산 잠금을 배우기 위한 테스트 프로그램으로 시작되었으며, 당시 Kafka에서 작업하면서 메시지 큐로 피벗하기 시작했습니다.
이것은 Go로 작성되었습니다. 테스트 주도 개발을 염두에 두고 시작했지만 곧 엉망진창이 되었습니다.

Lignum은 본격적인 메시지 대기열이 아니며 진행 중인 작업입니다. 당신은 할 수 있습니다
- 주제로 메시지 보내기
- 주제의 메시지 소비
- 메시지는 모든 노드에 복제됩니다. 즉, 모든 노드를 사용하여 주제에서 메시지를 읽을 수 있습니다.
- 디스크에 메시지 유지
- Lignum은 특별한 설정 없이 클러스터 모드에서 작동할 수 있습니다.
- Consul은 세션 잠금을 통해 클러스터 관리를 용이하게 합니다.
- 각 노드는 Consul에 연결하여 리더를 얻습니다. 리더가 없으면 노드 중 하나가 리더로 선출됩니다.
- 다른 모든 노드는 자신을 리더의 팔로워로 등록합니다.
- 리더에게 전송된 메시지는 팔로워 노드에 복제됩니다.
- 두 가지 복제 모드가 있습니다
. WAL 복제
b. 실시간 복제 - 리더가 쓰러지면 추종자 중 누구라도 리더로 선출됩니다.
현재 lignum은 두 가지 복제 전략 모드를 구현합니다.
- WAL 복제
- 라이브 복제.
WAL 복제
메시지가 config( message.initial-szie-per-topic
)에 정의된 버퍼 크기를 초과하면 각 주제에 대한 로그 파일이 생성됩니다. Lignum은 .qwal
주제별로 WAL 파일( )을 생성합니다. 메시지 수가 버퍼 크기에 도달하면 이 파일은 디스크에 log
파일로 플러시됩니다. Lignum은 이러한 로그 파일 생성을 자주 감시하고 추종자에게 보냅니다. 모든 팔로워는 리더와 주기적으로 동기화되어 최종/지연된 일관성을 제공합니다.
실시간 복제
이것은 스트리밍 복제입니다. 추종자가 리더에 이미 등록되어 있으면 이후에 주제가 생성된 경우 메시지 동기화에 대해 걱정할 필요가 없습니다. 리더에서 받은 메시지를 그대로 팔로워에게 전달할 수 있습니다. 이 전략에서는 메시지가 등록된 팔로워에게 즉시 전송됩니다. 이 방법으로 리그넘은 강력한 일관성을 제공할 수 있습니다.
리그넘을 실행하는 방법
- 전제 조건
— Consul README
에 지정된 대로 Dockerfile을 사용할 수 있습니다. - 저장소 복제
https://github.com/NishanthSpShetty/lignum.git
config.yml
, 구성에 대한 자세한 내용 은 이 문서 를 참조할 수 있습니다.make run
- 문자 보내
curl --request POST \
--url http://localhost:8080/api/message \
--header 'Content-Type: application/json' \
--data '{
"topic": "test",
"message":"this is a test message"
}'
curl --request GET \
--url http://localhost:8080/api/message \
--header 'Content-Type: application/json' \
--data '{
"topic": "test",
"from": 0,
"to": 3
}'
제공하는 배송 보장은 무엇입니까?
메시지가 지속되고 소비자가 언제든지 오프셋을 읽을 수 있으므로 배달 보증은 소비자에게 있습니다. Lignum은 메시지 순서를 보장합니다.
기존 클러스터에 노드를 추가할 수 있습니다.
- 호스트에 따라 구성을 변경하십시오.
- 이전 실행과 동일한 호스트에서 실행 중인 경우 구성 파일에서 포트, 데이터 디렉터리 및 복제 포트 값을 변경합니다.
- 달리다
make run
이것은 Lignum에 대한 짧은 소개입니다. 향후 내부 및 개발 세부 사항에 대한 별도의 문서를 작성하겠습니다.
코드는 Github에 있습니다: Lignum .
체크 아웃하고 피드백을 제공하십시오. 기여를 환영합니다.
내가 작업하고 있는 다른 멋진 프로젝트에 대한 내 Github 프로필을 확인하세요.
LinkedIn에서 나와 연결
https://www.linkedin.com/in/nishanthspshetty/