<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발일지</title>
    <link>https://float.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Fri, 10 Apr 2026 14:34:45 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>-JUNHEOK-</managingEditor>
    <image>
      <title>개발일지</title>
      <url>https://tistory1.daumcdn.net/tistory/4854846/attach/3799695360264e9a91b0462d0575b1f2</url>
      <link>https://float.tistory.com</link>
    </image>
    <item>
      <title>Nested Set Model: 계층적 데이터 관리를 위한 효율적인 접근법</title>
      <link>https://float.tistory.com/339</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. Nested Set Model 개요&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nested Set Model&lt;/b&gt;은 데이터베이스에서 계층적 데이터를 저장하고 관리하는 방법 중 하나입니다. 이 모델에서는 &lt;b&gt;각 노드를 두 개의 숫자(lft, rgt)로 표현&lt;/b&gt;하여 계층 구조를 효율적으로 조회할 수 있도록 합니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Nested Set Model의 원리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트리 구조의 각 노드는 왼쪽 값(lft)과 오른쪽 값(rgt)을 가지며, 이를 통해 트리 계층을 표현합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 다음과 같은 트리 구조를 생각해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;       A
      / \
     B   C
    / \   \
   D   E   F
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 Nested Set Model로 변환하면 다음과 같이 저장됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 126px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;ID&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;Name&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;&lt;span style=&quot;color: #ffffff; text-align: start;&quot;&gt;&amp;nbsp;lft&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;rgt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;A&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;B&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;C&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;D&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;E&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;5&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 18px;&quot;&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;6&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;F&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;7&lt;/td&gt;
&lt;td style=&quot;height: 18px;&quot;&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Nested Set Model의 장점과 단점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;장점&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;효율적인 계층적 데이터 조회&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;트리의 특정 서브트리를 SQL 한 번으로 조회할 수 있음&lt;/li&gt;
&lt;li&gt;JOIN 없이 계층 구조를 쉽게 표현 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;부모-자식 관계를 빠르게 조회 가능&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트리 전체를 빠르게 탐색 가능&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;단점&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;삽입, 삭제, 이동이 복잡함&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 노드를 추가하거나 삭제할 때, 기존의 lft, rgt 값을 변경해야 함&lt;/li&gt;
&lt;li&gt;노드 이동 시 전체 lft, rgt 값 조정이 필요하여 성능 부담이 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;트리 구조 변경 시 성능 저하&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;노드 추가, 삭제, 이동 시 전체 데이터에 영향을 미칠 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. Nested Set Model을 활용한 SQL 쿼리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1 서브트리 조회하기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 노드(A)의 모든 자식 노드 조회:&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT * FROM tree WHERE lft BETWEEN 1 AND 10;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2 부모 노드 찾기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 노드(E)의 부모 찾기:&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT * FROM tree WHERE lft &amp;lt; 5 AND rgt &amp;gt; 6 ORDER BY lft DESC LIMIT 1;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3 노드 삽입 알고리즘&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 노드를 추가할 때는 lft, rgt 값을 조정하는 알고리즘이 필요합니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;새로운 노드를 삽입할 위치를 결정&lt;/li&gt;
&lt;li&gt;기존 노드들의 rgt 값을 조정하여 공간 확보&lt;/li&gt;
&lt;li&gt;새 노드의 lft, rgt 값을 설정&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.4 노드 삭제 알고리즘&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;삭제할 노드의 lft, rgt 범위에 있는 값을 삭제한 후, 나머지 값을 업데이트하는 방식으로 진행됩니다.&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;DELETE FROM tree WHERE lft BETWEEN 3 AND 4;
UPDATE tree SET lft = lft - 2 WHERE lft &amp;gt; 4;
UPDATE tree SET rgt = rgt - 2 WHERE rgt &amp;gt; 4;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. Nested Set Model vs. Adjacency List Model&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Nested Set Model을 선택해야 하는 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;트리 구조에서 조회가 빈번&lt;/b&gt;하고, &lt;b&gt;변경이 드문 경우&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;계층 구조를 SQL 한 번으로 쉽게 조회해야 하는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Adjacency List Model을 선택해야 하는 경우&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;삽입/삭제가 빈번한 트리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;parent_id를 이용한 단순한 계층 구조가 필요한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. 결론&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Nested Set Model은 계층적 데이터를 SQL 한 번으로 효율적으로 조회할 수 있는 강력한 모델이지만, 삽입/삭제가 빈번한 경우 성능 문제가 발생할 수 있습니다.&lt;/b&gt; 따라서, 사용 목적에 따라 Nested Set Model과 Adjacency List Model을 적절히 선택하는 것이 중요합니다.&lt;/p&gt;</description>
      <author>-JUNHEOK-</author>
      <guid isPermaLink="true">https://float.tistory.com/339</guid>
      <comments>https://float.tistory.com/339#entry339comment</comments>
      <pubDate>Tue, 18 Mar 2025 23:54:18 +0900</pubDate>
    </item>
    <item>
      <title>Traefik + Prometheus + Grafana 모니터링 설정 (Docker Swarm)</title>
      <link>https://float.tistory.com/336</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Docker Swarm 환경에서 &lt;/span&gt;&lt;span&gt;&lt;b&gt;Traefik을 활용한 서비스 라우팅&lt;/b&gt;&lt;/span&gt;&lt;span&gt;과 함께 &lt;/span&gt;&lt;span&gt;&lt;b&gt;Prometheus로 메트릭을 수집&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하고, &lt;/span&gt;&lt;span&gt;&lt;b&gt;Grafana를 통해 시각화&lt;/b&gt;&lt;/span&gt;&lt;span&gt;하는 방법을 정리합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;설정 결과&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Traefik에서 Prometheus 메트릭 수집&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Prometheus가 메트릭을 저장 및 분석&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Grafana에서 시각화&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;이 설정을 통해 &lt;/span&gt;&lt;span&gt;&lt;b&gt;실시간 트랙픽 모니터링, 서비스 상황 확인, 장애 감지&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 등을 할 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;1. Prometheus와 Grafana란?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;Prometheus란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://prometheus.io/&quot;&gt;&lt;span&gt;Prometheus&lt;/span&gt;&lt;/a&gt;&lt;span&gt;는 오픈소스 모니터링 시스템으로, &lt;/span&gt;&lt;span&gt;&lt;b&gt;메트릭 수집 및 저장&lt;/b&gt;&lt;/span&gt;&lt;span&gt;을 담당합니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Pull 방식으로 메트릭 수집&lt;/b&gt;&lt;/span&gt;&lt;span&gt; (Server 가 Client의 &lt;/span&gt;&lt;span&gt;/metrics&lt;/span&gt;&lt;span&gt; 에서 데이터 가져오지만)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;시계열 데이터 저장 및 분석&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Alerting 시스템 부원 (기본적인 경고 막상)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Grafana와 통합 가능&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;Grafana란?&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;a&gt;Grafana&lt;/a&gt;&lt;/span&gt;&lt;span&gt;는 Prometheus 등의 메트릭을 &lt;/span&gt;&lt;span&gt;&lt;b&gt;시각화하는 대시보드 툴&lt;/b&gt;&lt;/span&gt;&lt;span&gt;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Prometheus 데이터를 그래프, 차트로 시각화&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;대시보드 컴터먼트화 가능&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;실시간 모니터링 가능&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Slack, Discord 등과 연동해 경고 (Alert) 가능&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-end=&quot;959&quot; data-start=&quot;939&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;전체 아키텍처&lt;br /&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;977&quot; data-start=&quot;960&quot; data-ke-size=&quot;size16&quot;&gt;아래와 같은 구조로 구성됩니다.&lt;/p&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;pre id=&quot;code_1741748231795&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;사용자 요청 &amp;rarr; Traefik &amp;rarr; 서비스 컨테이너
                     ↘ 
                      Prometheus (메트릭 수집)
                                ↘
                                 Grafana (시각화)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Traefik&lt;/b&gt;: 트래픽을 라우팅하고 Prometheus 메트릭을 노출 (/metrics)&lt;br /&gt;&lt;b&gt;Prometheus&lt;/b&gt;: Traefik에서 메트릭을 수집하고 저장&lt;br /&gt;&lt;b&gt;Grafana&lt;/b&gt;: Prometheus 데이터를 시각화하여 운영 현황을 쉽게 확인&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;&lt;b&gt;1. Traefik 설정 (Prometheus 메트릭 활성화)&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Traefik이 Prometheus 메트릭을 보도할 수 있도록 설정합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1741748099681&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;services:
  traefik:
    image: traefik:2.9
    command:
      - &quot;--metrics.prometheus=true&quot;
      - &quot;--metrics.prometheus.addEntryPointsLabels=true&quot;
      - &quot;--metrics.prometheus.addServicesLabels=true&quot;
      - &quot;--metrics.prometheus.buckets=0.1,0.3,1.2,5.0&quot;
      - &quot;--entryPoints.metrics.address=:8080&quot;
    ports:
      - &quot;8080:8080&quot;  # ✅ Prometheus가 메트릭을 가져가도록 필요&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;2305&quot; data-start=&quot;2254&quot;&gt;--metrics.prometheus=true: Prometheus 메트릭 활성화&lt;/li&gt;
&lt;li data-end=&quot;2402&quot; data-start=&quot;2306&quot;&gt;--entryPoints.metrics.address=:8080: Prometheus가 Traefik의 /metrics 엔드포인트에서 데이터를 가져가도록 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;b&gt;Traefik 배포 후 &lt;/b&gt;&lt;/span&gt;&lt;span&gt;&lt;b&gt;/metrics 엔드포인트 확인&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741748132241&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -s http://localhost:8080/metrics | head -n 20&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;&lt;b&gt;Prometheus 설정 (Traefik 메트릭 수집)&lt;br /&gt;&lt;/b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-end=&quot;2634&quot; data-start=&quot;2577&quot; data-ke-size=&quot;size16&quot;&gt;Prometheus가 Traefik의 /metrics 엔드포인트에서 데이터를 가져오도록 설정합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1741748360243&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;global:
  scrape_interval: 10s  # 10초마다 데이터 수집

scrape_configs:
  - job_name: 'traefik'
    metrics_path: '/metrics'
    static_configs:
      - targets: ['traefik:8080']&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1741748392735&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3.9'

services:
  prometheus:
    image: prom/prometheus:latest
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command:
      - &quot;--config.file=/etc/prometheus/prometheus.yml&quot;
    ports:
      - &quot;9090:9090&quot;
    networks:
      - traefik-network&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Prometheus.yml&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;&lt;b&gt;Grafana 설정 (Prometheus 데이터 시각화)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Grafana를 설정하여 Prometheus 데이터를 시각화할 수 있도록 합니다.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1741748196869&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3.9'

services:
  grafana:
    image: grafana/grafana:latest
    ports:
      - &quot;3000:3000&quot;
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=yourpassword
    networks:
      - traefik-network&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;3835&quot; data-start=&quot;3791&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Grafana 접속:&lt;/b&gt; http://&amp;lt;클러스터_IP&amp;gt;:3000&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-end=&quot;3878&quot; data-start=&quot;3836&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-end=&quot;3853&quot; data-start=&quot;3836&quot;&gt;&lt;b&gt;ID:&lt;/b&gt; admin&lt;/li&gt;
&lt;li data-end=&quot;3878&quot; data-start=&quot;3854&quot;&gt;&lt;b&gt;PW:&lt;/b&gt; yourpassword&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-end=&quot;3895&quot; data-start=&quot;3880&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 데이터 소스 추가&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;4036&quot; data-start=&quot;3896&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;3927&quot; data-start=&quot;3896&quot;&gt;http://localhost:3000 접속&lt;/li&gt;
&lt;li data-end=&quot;3964&quot; data-start=&quot;3928&quot;&gt;&lt;b&gt;데이터 소스 추가&lt;/b&gt; &amp;rarr; Prometheus 선택&lt;/li&gt;
&lt;li data-end=&quot;4006&quot; data-start=&quot;3965&quot;&gt;&lt;b&gt;URL:&lt;/b&gt; http://prometheus:9090 입력&lt;/li&gt;
&lt;li data-end=&quot;4036&quot; data-start=&quot;4007&quot;&gt;Save &amp;amp; Test &amp;rarr; 정상 연결 확인&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-end=&quot;4063&quot; data-start=&quot;4038&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) Traefik 2.0 대시보드 추가&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;4155&quot; data-start=&quot;4064&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;4090&quot; data-start=&quot;4064&quot;&gt;Grafana에서 Import 클릭&lt;/li&gt;
&lt;li data-end=&quot;4119&quot; data-start=&quot;4091&quot;&gt;Dashboard ID: 4475 입력&lt;/li&gt;
&lt;li data-end=&quot;4155&quot; data-start=&quot;4120&quot;&gt;Prometheus 데이터 소스를 선택 후 Load&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;4202&quot; data-start=&quot;4162&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;실시간 모니터링 가능한 Prometheus 메트릭&lt;/b&gt;&lt;/h2&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 105px;&quot; border=&quot;1&quot; data-end=&quot;4509&quot; data-start=&quot;4203&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody data-end=&quot;4509&quot; data-start=&quot;4245&quot;&gt;
&lt;tr style=&quot;height: 19px;&quot; data-end=&quot;4299&quot; data-start=&quot;4245&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;traefik_entrypoint_requests_total&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;엔트리포인트별 요청 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot; data-end=&quot;4348&quot; data-start=&quot;4300&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;traefik_service_requests_total&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;서비스별 요청 수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot; data-end=&quot;4410&quot; data-start=&quot;4349&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;traefik_backend_request_duration_seconds&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;백엔드 요청 응답 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot; data-end=&quot;4459&quot; data-start=&quot;4411&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;traefik_backend_requests_total&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;백엔드 요청 횟수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot; data-end=&quot;4509&quot; data-start=&quot;4460&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;traefik_tls_certs_not_after&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;TLS 인증서 만료 시간&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-end=&quot;4567&quot; data-start=&quot;4511&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Grafana에서 트래픽 요청, 응답 속도, TLS 상태 등을 한눈에 모니터링 가능!&lt;/b&gt;  &lt;/p&gt;
&lt;p data-end=&quot;4567&quot; data-start=&quot;4511&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-end=&quot;4585&quot; data-start=&quot;4574&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;결론&lt;/b&gt;&lt;/h2&gt;
&lt;p data-end=&quot;4652&quot; data-start=&quot;4586&quot; data-ke-size=&quot;size16&quot;&gt;이제 &lt;b&gt;Traefik + Prometheus + Grafana&lt;/b&gt;를 통해 실시간으로 트래픽을 모니터링할 수 있습니다.&lt;/p&gt;
&lt;p data-end=&quot;4739&quot; data-start=&quot;4654&quot; data-ke-size=&quot;size16&quot;&gt;1) Prometheus에서 Traefik 메트릭 수집&lt;br /&gt;2) Grafana에서 실시간 요청량, 응답 속도 시각화&lt;br /&gt;3) 장애 감지 및 알림 설정 가능&lt;/p&gt;
&lt;p data-is-only-node=&quot;&quot; data-is-last-node=&quot;&quot; data-end=&quot;4811&quot; data-start=&quot;4741&quot; data-ke-size=&quot;size16&quot;&gt;실시간 트래픽 분석 및 운영 모니터링을 강화할 수 있습니다&lt;/p&gt;</description>
      <author>-JUNHEOK-</author>
      <guid isPermaLink="true">https://float.tistory.com/336</guid>
      <comments>https://float.tistory.com/336#entry336comment</comments>
      <pubDate>Wed, 12 Mar 2025 12:02:31 +0900</pubDate>
    </item>
    <item>
      <title>Jasypt를 활용한 Spring Boot 환경 변수 암호화</title>
      <link>https://float.tistory.com/326</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Spring Boot 프로젝트에서 환경 변수나 민감한 정보를 안전하게 관리하기 위해 &lt;/span&gt;&lt;span&gt;&lt;b&gt;Jasypt&lt;/b&gt;&lt;/span&gt;&lt;span&gt;를 사용할 수 있습니다. Jasypt를 이용하면 &lt;/span&gt;&lt;span&gt;application.yml&lt;/span&gt;&lt;span&gt;에 있는 데이터베이스 연결 정보나 API 키 등을 암호화하여 보안성을 높일 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;1. Jasypt 의존성 추가&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Spring Boot에서 Jasypt를 사용하려면 아래와 같이 &lt;/span&gt;&lt;span&gt;build.gradle&lt;/span&gt;&lt;span&gt;에 의존성을 추가해야 합니다.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738734289906&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// Jasypt 암호화
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;2. Jasypt 설정 (JasyptConfig.java)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Jasypt의 암호화 설정을 위한 &lt;/span&gt;&lt;span&gt;@Configuration&lt;/span&gt;&lt;span&gt; 클래스를 생성합니다.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738734328115&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@Configuration
public class JasyptConfig {

    @Bean(name = &quot;jasyptStringEncryptor&quot;)
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();

        // 환경 변수에서 Jasypt 암호화 키 가져오기
        String password = System.getenv(&quot;JASYPT_ENCRYPTOR_PASSWORD&quot;);
        if (password == null || password.isEmpty()) {
            password = &quot;&quot;; // 기본값 제공 (운영 환경에서는 사용 지양)
            System.out.println(&quot;[WARNING] JASYPT_ENCRYPTOR_PASSWORD가 설정되지 않아 기본 키를 사용합니다.&quot;);
        }
        config.setPassword(password);
        
        // 암호화 알고리즘 설정
        config.setAlgorithm(&quot;PBEWITHHMACSHA512ANDAES_256&quot;);
        config.setKeyObtentionIterations(&quot;1000&quot;);
        config.setPoolSize(&quot;1&quot;);
        config.setProviderName(&quot;SunJCE&quot;);
        config.setSaltGeneratorClassName(&quot;org.jasypt.salt.RandomSaltGenerator&quot;);
        config.setIvGeneratorClassName(&quot;org.jasypt.iv.RandomIvGenerator&quot;);
        config.setStringOutputType(&quot;base64&quot;);

        encryptor.setConfig(config);
        return encryptor;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;3. Jasypt 암호화 테스트 (EncryptionTest.java)&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Jasypt 암호화 및 복호화가 정상적으로 동작하는지 확인하는 JUnit 테스트 코드를 작성합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738734369953&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;@SpringBootTest
public class EncryptionTest {
    
    @BeforeAll
    static void setup() {
        System.setProperty(&quot;JASYPT_ENCRYPTOR_PASSWORD&quot;, &quot;&quot;);
    }
    
    @Test
    public void testEncryption() {
        // 환경 변수에서 암호화 키를 가져옴
        String password = System.getenv(&quot;JASYPT_ENCRYPTOR_PASSWORD&quot;);
        if (password == null || password.isEmpty()) {
            password = &quot;keystrom&quot;;
        }

        // 암호화기 설정
        StringEncryptor encryptor = new JasyptConfig().stringEncryptor();

        // 테스트할 데이터
        String dbUrl = &quot;your-db-url&quot;;
        String dbUsername = &quot;your-username&quot;;
        String dbPassword = &quot;your-password&quot;;

        // 암호화
        String encryptedUrl = encryptor.encrypt(dbUrl);
        String encryptedUsername = encryptor.encrypt(dbUsername);
        String encryptedPassword = encryptor.encrypt(dbPassword);

        // 암호화된 결과 출력
        System.out.println(&quot;Encrypted URL: &quot; + encryptedUrl);
        System.out.println(&quot;Encrypted Username: &quot; + encryptedUsername);
        System.out.println(&quot;Encrypted Password: &quot; + encryptedPassword);

        // 암호화된 값이 null이 아닌지 확인
        assertNotNull(encryptedUrl);
        assertNotNull(encryptedUsername);
        assertNotNull(encryptedPassword);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;4. IntelliJ 환경 변수 설정&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;로컬 개발 환경에서 &lt;/span&gt;&lt;span&gt;JASYPT_ENCRYPTOR_PASSWORD&lt;/span&gt;&lt;span&gt;를 설정하려면 &lt;/span&gt;&lt;span&gt;&lt;b&gt;IntelliJ Run/Debug Configurations&lt;/b&gt;&lt;/span&gt;&lt;span&gt;에서 환경 변수를 추가해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-pm-slice=&quot;1 3 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;설정 방법&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-spread=&quot;false&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;Run/Debug Configurations&lt;/span&gt;&lt;span&gt; 창을 엽니다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;실행할 애플리케이션을 선택한 후 &lt;/span&gt;&lt;span&gt;&lt;b&gt;Edit Configurations...&lt;/b&gt;&lt;/span&gt;&lt;span&gt; 클릭&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Environment Variables&lt;/span&gt;&lt;span&gt; 섹션에서 &lt;/span&gt;&lt;span&gt;JASYPT_ENCRYPTOR_PASSWORD=your-secret-key&lt;/span&gt;&lt;span&gt; 추가&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;Apply&lt;/span&gt;&lt;span&gt; &amp;rarr; &lt;/span&gt;&lt;span&gt;OK&lt;/span&gt;&lt;span&gt; &amp;rarr; 애플리케이션 실행&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;5. Docker 환경에서 Jasypt 적용&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;서버에 배포할 때, 환경 변수를 올바르게 설정해야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;docker-compose.yml에서 설정&lt;/span&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1738734484199&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3'
services:
  app:
    image: your-image-name
    environment:
      - JASYPT_ENCRYPTOR_PASSWORD=your-secure-password&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-pm-slice=&quot;1 1 []&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;6. &lt;/span&gt;&lt;span&gt;application.yml&lt;/span&gt;&lt;span&gt;에서 암호화된 값 사용하기&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;암호화된 데이터를 &lt;/span&gt;&lt;span&gt;application.yml&lt;/span&gt;&lt;span&gt;에 저장할 때는 &lt;/span&gt;&lt;span&gt;ENC()&lt;/span&gt;&lt;span&gt;로 감싸야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738734522573&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;spring:
  datasource:
    url: ENC(encrypted-db-url)
    username: ENC(encrypted-username)
    password: ENC(encrypted-password)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;Jasypt를 활용하면 민감한 정보를 안전하게 관리할 수 있습니다.&lt;/span&gt;&lt;/p&gt;</description>
      <author>-JUNHEOK-</author>
      <guid isPermaLink="true">https://float.tistory.com/326</guid>
      <comments>https://float.tistory.com/326#entry326comment</comments>
      <pubDate>Wed, 5 Feb 2025 14:49:42 +0900</pubDate>
    </item>
    <item>
      <title>개인 서버의 무중단 서버 구축</title>
      <link>https://float.tistory.com/324</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요. 현재 저의 서버로 구축하고 있는 환경에 관해 설명하고자합니다. &lt;br /&gt;저는 온프레미스(On-premise) 환경에서 Docker Stack 배포하는 docker swarm , 그리고 kuberneter k8s 를 구축한 경험을 가지고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 블로그는&lt;b&gt; Docker Swarm &lt;/b&gt;을 기반으로 &lt;b&gt;온프레미스(On-premise) 환경&lt;/b&gt;에서의 &lt;b&gt;죽지 않는 서버 즉, 무중단 서버로 구축&lt;/b&gt;을 하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;서바가 죽지 않는 이유는 Docker Swarm이 제공하는 내재적인 고가용성(High Availability) 및 복구 메커니즘 때문입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;아래와 같은 9가지를 적용하며, 구축을 진행했습니다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;서비스 복제(Replication)&lt;/li&gt;
&lt;li&gt;오토 힐링(Auto-Healing)&lt;/li&gt;
&lt;li&gt;서비스 상태 관리(desired state reconciliation)&lt;/li&gt;
&lt;li&gt;리소스 분산 및 로드 밸런싱&lt;/li&gt;
&lt;li&gt;리더 선출 및 매니저 노드 복구&lt;/li&gt;
&lt;li&gt;노드 장애 복구&lt;/li&gt;
&lt;li&gt;재시작 정책(Restart Policy)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;NFS&lt;/b&gt;와 같은 &lt;b&gt;공유 스토리지&lt;/b&gt;의 활용&lt;/li&gt;
&lt;li&gt;스케일링 및 롤링 업데이트&lt;/li&gt;
&lt;/ol&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 서비스 복제(Replication)&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;deploy:
  replicas: 3&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;br /&gt;복제(replication) 를 정의할 수 있습니다. 복제본이 항상 정해진 수로 유지되도록 관리하며, 특정 노드나 컨테이너가 장애가 나도 서비스가 지속됩니다. &lt;br /&gt;&lt;br /&gt;우선적으로 매니저노드와 워커노드에 관련해서 알아봐야 합니다.&lt;br /&gt;매니저 노드와 워커노드는 서버하나당 지칭을 합니다. 그 중에서 매니저 노드는 리더 선출(Leader Election) 알고리즘을 사용해서 고가용성을 보장합니다. &lt;br /&gt;이 알고리즘은 &lt;b&gt;Raft Consensus&lt;/b&gt;를 기반으로 하며, 다음과 같은 특징이 있습니다&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;클러스터에서 합의(consensus)를 이루기 위해 전체 매니저 노드 중 과반수의 동의가 필요합니다.&lt;/li&gt;
&lt;li&gt;과반수는 n/2 + 1의 노드가 필요하므로, 다음과 같은 매니저 노드 구성이 가능합니다.&lt;br /&gt;- 1개 : 단독 운영이 가능하지만 고가용성 불가 &lt;br /&gt;- 3개: 1개의 노드가 장애가 나도 과반수 유지 가능(고가용성)&lt;br /&gt;- 5개: 2개의 노드가 장애가 나도 과반수 유지가능(고갸용성 강화)&lt;br /&gt;- 짝수 매니저는 권장되지 않습니다. 과반수를 구성하기 어려운 구조이기 때문입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 &lt;b&gt;매니저 노드가 최소 3개&lt;/b&gt;여야합니다. 즉 &lt;b&gt;장애 복구 및 리더 선출이 가능&lt;/b&gt;합니다. &lt;b&gt;워커노드&lt;/b&gt;는 몇개든지 유연하게 &lt;b&gt;스케일 아웃&lt;/b&gt;(Scale-Out)을 할 수 있습니다. &lt;br /&gt;결국 Docker Swarm 클러스터는 &lt;b&gt;스케일 아웃(Scale-Out) 아키텍처&lt;/b&gt;로 설계된 오케스트레이션 도구입니다. 스케일 아웃은 수평확장을 통해 시스템의 성능과 가용성을 높이는 방식입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;스케일 아웃의 장점&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;고가용성(HA)&lt;/b&gt;: 매니저 노드와 워커 노드가 장애를 일으켜도 시스템이 지속적으로 동작.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;확장성&lt;/b&gt;: 시스템의 요구에 따라 노드를 추가하여 처리량을 유연하게 확장.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비용 효율성&lt;/b&gt;: 스케일 업보다 저비용으로 처리량을 증가시킬 수 있음(저가 하드웨어 활용 가능).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;부하 분산&lt;/b&gt;: 여러 노드에 워크로드를 분산하여 성능을 최적화.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 오토 힐링(Auto-Healing)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Swarm은 컨테이너를 지속적으로 모니터링하고, 문제가 발생한 컨테이너를 자동으로 재시작하거나 다른 노드에 재배치합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오토 힐링의 작동 방식:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너가 중단되거나 비정상적으로 종료되면, Swarm은 즉시 상태를 감지합니다.&lt;/li&gt;
&lt;li&gt;Swarm은 장애 컨테이너를 종료하고, 정의된 상태(desired state)를 복구하기 위해 새로운 컨테이너를 배포합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Swarm 오토 힐링 동작&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과적으로 서비스의 가용성을 유지.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;deploy:
      replicas: 3
      restart_policy:
        condition: any  # 컨테이너가 어떤 이유로든 종료되면 재시작&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 아래와 같이 서비스를 업데이트할 때 전략을 세부적으로 제어할수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;update_config:
  delay: 15s       ##각 업데이트 작업 간의 대기 시간을 지정
  parallelism: 1  ##한번에 업데이트할 컨테이너(태스크) 수를 지정합니다
  monitor: 10s   ##헬스체크 및 안정성 모니터링 시간을 설정합니다.
  failure_action: rollback  ##업데이트 실패 시 수행할 동작 정의
  max_failure_ratio: 0.55 ##업데이트 실패 허용 비율을 설정합니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 서비스 상태 관리(desired state reconciliation)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Swarm은 원하는 상태와 현재 상태를 비교해서 클러스터를 관리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 5개의 복제본이 필요한 서비스에서 1개의 컨테이너가 실패하면 Swarm은 현재 상태를 원하는 상태와 일치시키기 위해 즉시 새 컨테이너를 생성합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4.. &lt;b&gt;리소스 분산 및 로드 밸런싱&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Swarm은 클러스터의 리소스를 최적화하면서 서비스를 실행합니다. 이를 통해 특정 노드가 과부하로 인해 실패하더라도 다른 노드가 이를 처리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;내장 로드 밸런서&lt;/b&gt;: Swarm은 서비스의 요청을 복제본 간에 분산합니다. 사용자는 단일 VIP(Virtual IP) 또는 DNS 이름을 통해 서비스를 호출하며, Swarm은 이를 적절히 라우팅합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;리더 선출 및 매니저 노드 복구&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Swarm 클러스터는 &lt;b&gt;매니저 노드의 고가용성&lt;/b&gt;을 보장하기 위해 &lt;b&gt;리더 선출(Leader Election)&lt;/b&gt; 알고리즘을 사용합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매니저 노드가 여러 개일 경우, 한 노드가 장애가 나도 다른 매니저가 리더로 선출되어 클러스터를 계속 운영합니다.&lt;/li&gt;
&lt;li&gt;장애가 난 매니저 노드를 복구하거나 새로운 노드를 추가하면 자동으로 클러스터에 다시 합류됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. &lt;b&gt;노드 장애 복구&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Swarm은 노드의 상태를 지속적으로 모니터링합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 워커 노드가 장애를 일으키면 Swarm은 해당 노드에서 실행되던 모든 서비스를 다른 가용 노드에 재배치합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. &lt;b&gt;재시작 정책(Restart Policy)&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택 배포 시, 각 서비스에 재시작 정책(restart policy)을 설정할 수 있습니다. 이는 컨테이너의 실패를 감지하고 자동으로 재시작하게 만듭니다.&lt;/p&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;deploy:
  restart_policy:
    condition: on-failure ##컨테이너가 오류로 종료되었을때만 재시작.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;8. &lt;b&gt;NFS와 같은 공유 스토리지의 활용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Swarm에서 NFS와 같은 공유 스토리지를 사용하면, 서비스 데이터가 노드 간에 공유되므로 특정 노드 장애가 발생해도 데이터 손실 없이 다른 노드에서 서비스를 계속 실행할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 서버같은 경우는 NFS ( network file system) 서버를 구축한 후 마운팅을 진행하여 데이터 손실없이 다른 노드 서비스에서도 실행할 수 있게 구축을 진행했습니다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;9.&lt;b&gt;스케일링 및 롤링 업데이트&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Swarm은 서비스를 동적으로 스케일링하거나 롤링 업데이트를 지원합니다. 이를 통해 서비스 중단 없이 애플리케이션을 업데이트하거나 확장할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;결론: Docker Swarm으로 구축한 서버가 죽지 않는 이유&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Swarm은 클러스터의 서비스 상태를 지속적으로 모니터링하고, 컨테이너와 노드의 장애에 대해 자동으로 복구 작업을 수행합니다. 또한, 리소스 분산, 복제, 오토 힐링, 재시작 정책, 리더 선출 등 여러 고가용성 메커니즘을 통해 장애 상황에서도 &lt;b&gt;서비스 중단을 최소화&lt;/b&gt;합니다.&lt;/p&gt;</description>
      <category>Docker</category>
      <author>-JUNHEOK-</author>
      <guid isPermaLink="true">https://float.tistory.com/324</guid>
      <comments>https://float.tistory.com/324#entry324comment</comments>
      <pubDate>Tue, 21 Jan 2025 20:25:15 +0900</pubDate>
    </item>
    <item>
      <title>[Elasticsearch] ELK 이슈 해결 -  Kibana server is not ready yet</title>
      <link>https://float.tistory.com/316</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 글에서는 Docker Swarm 환경에서 &lt;b&gt;ELK(Elasticsearch, Logstash, Kibana)&lt;/b&gt; 스택을 설치하고, &lt;b&gt;Kibana&lt;/b&gt; 접속 시 자주 발생하는 문제인 'Kibana server is not ready yet'를 해결한 경험을 공유하고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;1. Docker Swarm에서 ELK 스택 설치&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ELK 스택은 로그 수집, 분석, 시각화에 널리 사용되는 도구입니다. 아래는 제가 사용한 docker-compose.yml 설정입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ELK 스택 구성 파일&lt;/b&gt;&lt;/h3&gt;
&lt;pre id=&quot;code_1732030750041&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3.9'

networks:
  elk:
    driver: overlay

volumes:
  elk-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /volumes/elk

services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.10.2-arm64
    ports:
      - &quot;9200:9200&quot;
      - &quot;9300:9300&quot;
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - network.host=0.0.0.0
      - xpack.license.self_generated.type=trial
    volumes:
      - elk-data:/usr/share/elasticsearch/data
    networks:
      - elk
    deploy:
      labels:
        - &quot;traefik.enable=true&quot;
        - &quot;traefik.http.routers.elasticsearch.rule=Host(`ex.domain`)&quot;
        - &quot;traefik.http.services.elasticsearch.loadbalancer.server.port=9200&quot;
        - &quot;traefik.http.routers.elasticsearch.entrypoints=websecure&quot;
        - &quot;traefik.http.routers.elasticsearch.tls=true&quot;
        - &quot;traefik.http.routers.elasticsearch.tls.certresolver=letsencrypt&quot;

  kibana:
    image: docker.elastic.co/kibana/kibana:8.10.2-arm64
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    ports:
      - &quot;5601:5601&quot;
    networks:
      - elk
    deploy:
      labels:
        - &quot;traefik.enable=true&quot;
        - &quot;traefik.http.routers.kibana.rule=Host(`ex.domain`)&quot;
        - &quot;traefik.http.services.kibana.loadbalancer.server.port=5601&quot;
        - &quot;traefik.http.routers.kibana.entrypoints=websecure&quot;
        - &quot;traefik.http.routers.kibana.tls=true&quot;
        - &quot;traefik.http.routers.kibana.tls.certresolver=letsencrypt&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;93f3342c-0e68-4ef4-95f5-1f0ef770087d&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&amp;nbsp;2. Kibana 오류: 'Kibana server is not ready yet'&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설치 후 브라우저에서 &lt;a href=&quot;https://kibana.keystrom.site&quot;&gt;https://kibana.keystrom.site&lt;/a&gt;에 접속했을 때, 다음 오류를 만났습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Kibana server is not ready yet&lt;/b&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 오류는 Elasticsearch와 Kibana 간 연결이 원활하지 않거나 설정에 문제가 있을 때 발생합니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;3. 문제 원인과 해결 방법&lt;/b&gt;&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 원인&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Elasticsearch 연결 설정 문제&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Kibana가 Elasticsearch에 올바르게 연결되지 못했을 가능성.&lt;/li&gt;
&lt;li&gt;ELASTICSEARCH_HOSTS 환경 변수가 잘못된 값을 참조하고 있었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;추가 호스트 설정 문제&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;extra_hosts로 Elasticsearch IP를 강제로 맵핑하여 Docker 네트워크 해석이 충돌할 수 있었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre id=&quot;code_1732030863672&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;extra_hosts:
  - &quot;elasticsearch:10.0.25.14&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;9299b26f-021a-4592-8c98-aedcfcb59b23&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 설정은 Docker Swarm 기반으로 Traefik과 ELK 스택의 통합을 목표로 하고 있습니다. 주요 문제는 &lt;b&gt;Kibana와 Elasticsearch 간의 연결 문제&lt;/b&gt;입니다. 최종 연결 테스트를 진행하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;&lt;b&gt;Kibana 서비스와 Elasticsearch 연결 테스트&lt;/b&gt;&lt;/div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;1. Elasticsearch 연결 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Swarm 노드에서 Elasticsearch 서비스가 정상적으로 응답하는지 테스트합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1732030985829&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl -X GET http://elasticsearch:9200​&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정상 응답 시: Kibana와 연결 가능&lt;/li&gt;
&lt;li&gt;오류 발생 시: Docker 네트워크 설정을 점검하세요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;2 Kibana 로그 확인&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Kibana 서비스의 로그를 확인하여 추가적인 오류 메시지를 파악합니다.&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1732030974265&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker service logs kibana --follow​&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;ad1792d8-b265-497b-b3d3-5745e5669a04&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인 서버에서 &lt;b&gt;Elasticsearch&lt;/b&gt;와 &lt;b&gt;Kibana&lt;/b&gt;를 &lt;b&gt;Docker Swarm 클러스터&lt;/b&gt; 환경에서 구축했습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1575&quot; data-origin-height=&quot;1218&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAEO1x/btsKOrljJS2/zagKLkekdvAUhaNErwAhkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAEO1x/btsKOrljJS2/zagKLkekdvAUhaNErwAhkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAEO1x/btsKOrljJS2/zagKLkekdvAUhaNErwAhkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAEO1x%2FbtsKOrljJS2%2FzagKLkekdvAUhaNErwAhkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1575&quot; height=&quot;1218&quot; data-origin-width=&quot;1575&quot; data-origin-height=&quot;1218&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <author>-JUNHEOK-</author>
      <guid isPermaLink="true">https://float.tistory.com/316</guid>
      <comments>https://float.tistory.com/316#entry316comment</comments>
      <pubDate>Wed, 20 Nov 2024 00:45:00 +0900</pubDate>
    </item>
    <item>
      <title>rabbitmq[5]  RabbitMQ 관리 플러그인 사용법 정리</title>
      <link>https://float.tistory.com/315</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;RabbitMQ 관리 플러그인&lt;/b&gt;은 RabbitMQ의 동작을 직관적으로 이해하고 관리할 수 있도록 돕는 도구입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker를 사용해 RabbitMQ를 설치했다면, 기본적으로 이 플러그인은 활성화되며 &lt;b&gt;포트 15672&lt;/b&gt;에서 작동합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전 게시물에 Docker 에서 RabbitMQ를 설치하였습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://float.tistory.com/313&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://float.tistory.com/313&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732020944550&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;rabbitmq[4]  Docker를 사용하여 RabbitMQ를 설치하고 설정하는 방법&quot; data-og-description=&quot;Docker를&amp;nbsp;사용하여&amp;nbsp;RabbitMQ를&amp;nbsp;설치하고&amp;nbsp;설정하는&amp;nbsp;방법&amp;nbsp;Docker   Stack을 사용하여 RabbitMQ를 설치 및 설정하는 방법을 소개합니다. RabbitMQ는 Windows, Linux, macOS 등 다양한 환경에서 설치가 가능하지만, &quot; data-og-host=&quot;float.tistory.com&quot; data-og-source-url=&quot;https://float.tistory.com/313&quot; data-og-url=&quot;https://float.tistory.com/313&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c5ZOTP/hyXzRLj5ca/yZPXnzOv5dVdOT8bF09o4K/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/flCH8/hyXzOgJXuy/BG5CR3io8i6oCgC7o6rXrK/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/r2Idq/hyXzRdwjAX/SlfhGKdGEYk2twXK9exVv1/img.png?width=1691&amp;amp;height=748&amp;amp;face=0_0_1691_748&quot;&gt;&lt;a href=&quot;https://float.tistory.com/313&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://float.tistory.com/313&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c5ZOTP/hyXzRLj5ca/yZPXnzOv5dVdOT8bF09o4K/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/flCH8/hyXzOgJXuy/BG5CR3io8i6oCgC7o6rXrK/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/r2Idq/hyXzRdwjAX/SlfhGKdGEYk2twXK9exVv1/img.png?width=1691&amp;amp;height=748&amp;amp;face=0_0_1691_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;rabbitmq[4] Docker를 사용하여 RabbitMQ를 설치하고 설정하는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker를&amp;nbsp;사용하여&amp;nbsp;RabbitMQ를&amp;nbsp;설치하고&amp;nbsp;설정하는&amp;nbsp;방법&amp;nbsp;Docker   Stack을 사용하여 RabbitMQ를 설치 및 설정하는 방법을 소개합니다. RabbitMQ는 Windows, Linux, macOS 등 다양한 환경에서 설치가 가능하지만,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;float.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RabbitMQ 관리 플러그인을 활용하여 큐와 교환기(Exchange)를 생성하고 바인딩하는 과정을 정리한 내용입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. &lt;b&gt;RabbitMQ 관리 플러그인 접속&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;167&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blhIhj/btsKOdt68Bm/XQofovaPcOccxuyQjHnlk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blhIhj/btsKOdt68Bm/XQofovaPcOccxuyQjHnlk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blhIhj/btsKOdt68Bm/XQofovaPcOccxuyQjHnlk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblhIhj%2FbtsKOdt68Bm%2FXQofovaPcOccxuyQjHnlk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;390&quot; height=&quot;167&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;167&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; font-size: 16px; letter-spacing: 0px;&quot;&gt;로그인하면 RabbitMQ 관리 플러그인의 대시보드 화면이 표시됩니다.&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. &lt;b&gt;주요 메뉴 소개&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;582&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biPdrp/btsKOMW20E8/5yk5sKK0aY7tMUHKiPkfP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biPdrp/btsKOMW20E8/5yk5sKK0aY7tMUHKiPkfP1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biPdrp/btsKOMW20E8/5yk5sKK0aY7tMUHKiPkfP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiPdrp%2FbtsKOMW20E8%2F5yk5sKK0aY7tMUHKiPkfP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1328&quot; height=&quot;582&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;582&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Connections:&lt;/b&gt; RabbitMQ 서버와 연결된 TCP 연결 정보를 확인할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Channels:&lt;/b&gt; 메시지가 송수신되는 채널 정보를 확인할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Exchanges:&lt;/b&gt; 메시지를 큐로 전달하기 위한 교환기를 관리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Queues:&lt;/b&gt; 메시지를 저장하고 소비자(Consumer)가 가져가는 큐를 관리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. &lt;b&gt;Exchange 생성&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;298&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byS3XV/btsKOwUqmuH/wUTJS4IZtB7JHjE24hVRd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byS3XV/btsKOwUqmuH/wUTJS4IZtB7JHjE24hVRd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byS3XV/btsKOwUqmuH/wUTJS4IZtB7JHjE24hVRd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyS3XV%2FbtsKOwUqmuH%2FwUTJS4IZtB7JHjE24hVRd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;693&quot; height=&quot;298&quot; data-origin-width=&quot;693&quot; data-origin-height=&quot;298&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Exchanges&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;탭 클릭 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Add a new exchange&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼 클릭&lt;/li&gt;
&lt;li&gt;설정값 입력:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Exchange 이름:&lt;/b&gt; exchange_demo&lt;/li&gt;
&lt;li&gt;&lt;b&gt;유형:&lt;/b&gt; Direct (기본값)&lt;/li&gt;
&lt;li&gt;나머지 값은 기본값 유지.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Add exchange&lt;/b&gt; 클릭 &amp;rarr; exchange_demo 교환기가 생성됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. &lt;b&gt;Queue 생성&lt;br /&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;839&quot; data-origin-height=&quot;329&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mE8n3/btsKNTizlE3/sMkyz7DvaUm7JphVgRtCe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mE8n3/btsKNTizlE3/sMkyz7DvaUm7JphVgRtCe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mE8n3/btsKNTizlE3/sMkyz7DvaUm7JphVgRtCe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmE8n3%2FbtsKNTizlE3%2FsMkyz7DvaUm7JphVgRtCe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;839&quot; height=&quot;329&quot; data-origin-width=&quot;839&quot; data-origin-height=&quot;329&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Queues&lt;/b&gt; 탭 클릭 &amp;rarr; &lt;b&gt;Add a new queue&lt;/b&gt; 버튼 클릭.&lt;/li&gt;
&lt;li&gt;설정값 입력:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Queue 이름:&lt;/b&gt; queue_demo&lt;/li&gt;
&lt;li&gt;나머지 값은 기본값 유지.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Add queue&lt;/b&gt; 클릭 &amp;rarr; queue_demo 큐가 생성됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. &lt;b&gt;Exchange와 Queue 바인딩&lt;/b&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yRcTV/btsKQfKswYo/JC3nMwHfKzoZzvVBDJ21o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yRcTV/btsKQfKswYo/JC3nMwHfKzoZzvVBDJ21o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yRcTV/btsKQfKswYo/JC3nMwHfKzoZzvVBDJ21o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyRcTV%2FbtsKQfKswYo%2FJC3nMwHfKzoZzvVBDJ21o1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;703&quot; height=&quot;272&quot; data-origin-width=&quot;703&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Exchanges&lt;/b&gt; 탭으로 이동 &amp;rarr; exchange_demo 클릭.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Add binding from this exchange to queue&lt;/b&gt; 섹션에서 아래 값 입력:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Queue 이름:&lt;/b&gt; queue_demo&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Routing Key:&lt;/b&gt; routing_key_demo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Bind&lt;/b&gt; 버튼 클릭 &amp;rarr; exchange_demo와 queue_demo가 routing_key_demo를 통해 바인딩됩니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;207&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcttWk/btsKOV7x3Nl/1a9neTKwbctDKfoLoCT910/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcttWk/btsKOV7x3Nl/1a9neTKwbctDKfoLoCT910/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcttWk/btsKOV7x3Nl/1a9neTKwbctDKfoLoCT910/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcttWk%2FbtsKOV7x3Nl%2F1a9neTKwbctDKfoLoCT910%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;533&quot; height=&quot;207&quot; data-origin-width=&quot;533&quot; data-origin-height=&quot;207&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. &lt;b&gt;메시지 전송 및 확인&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Exchanges&lt;/b&gt; 탭 &amp;rarr; exchange_demo 클릭.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;267&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xD228/btsKN45bJzv/FeEY3mzpxq2Muu07npOFzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xD228/btsKN45bJzv/FeEY3mzpxq2Muu07npOFzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xD228/btsKN45bJzv/FeEY3mzpxq2Muu07npOFzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxD228%2FbtsKN45bJzv%2FFeEY3mzpxq2Muu07npOFzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;699&quot; height=&quot;267&quot; data-origin-width=&quot;699&quot; data-origin-height=&quot;267&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Publish message&lt;/b&gt; 섹션에서 아래 값 입력:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Routing Key:&lt;/b&gt; routing_key_demo&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Payload:&lt;/b&gt; 전송할 메시지, 예: hello word&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;461&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8zanA/btsKNyZMRTo/8HSyUmCzSzPeGcssDyMZGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8zanA/btsKNyZMRTo/8HSyUmCzSzPeGcssDyMZGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8zanA/btsKNyZMRTo/8HSyUmCzSzPeGcssDyMZGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8zanA%2FbtsKNyZMRTo%2F8HSyUmCzSzPeGcssDyMZGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;483&quot; height=&quot;461&quot; data-origin-width=&quot;483&quot; data-origin-height=&quot;461&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3.Publish message&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼 클릭 &amp;rarr; 메시지가 전송됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;86&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FVc2r/btsKPC7elrR/uyKcZYXjE3MRMrIYT5evr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FVc2r/btsKPC7elrR/uyKcZYXjE3MRMrIYT5evr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FVc2r/btsKPC7elrR/uyKcZYXjE3MRMrIYT5evr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFVc2r%2FbtsKPC7elrR%2FuyKcZYXjE3MRMrIYT5evr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1261&quot; height=&quot;86&quot; data-origin-width=&quot;1261&quot; data-origin-height=&quot;86&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Queues&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;탭 &amp;rarr; queue_demo 클릭 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Get messages&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;버튼 클릭:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;큐에 도착한 메시지를 확인할 수 있습니다. 예: hello word.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKjoLF/btsKOUOh5eX/lRoa2oLLGLVCfLt3dIKzV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKjoLF/btsKOUOh5eX/lRoa2oLLGLVCfLt3dIKzV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKjoLF/btsKOUOh5eX/lRoa2oLLGLVCfLt3dIKzV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKjoLF%2FbtsKOUOh5eX%2FlRoa2oLLGLVCfLt3dIKzV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;908&quot; height=&quot;427&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. &lt;b&gt;RabbitMQ 메시지 흐름&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;프로듀서(Producer):&lt;/b&gt; 메시지와 Routing Key를 Exchange로 전송.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Exchange:&lt;/b&gt; Routing Key를 사용해 적합한 큐로 메시지 전달.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;큐(Queue):&lt;/b&gt; 메시지를 저장, 소비자가 가져가도록 대기.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;RabbitMQ 관리 플러그인을 사용하면 큐와 교환기의 생성, 메시지 전송 및 흐름을 간편하게 확인하고 관리할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>-JUNHEOK-</author>
      <guid isPermaLink="true">https://float.tistory.com/315</guid>
      <comments>https://float.tistory.com/315#entry315comment</comments>
      <pubDate>Tue, 19 Nov 2024 22:21:17 +0900</pubDate>
    </item>
    <item>
      <title>Docker Compose에서 Volume을 정의하는 이유</title>
      <link>https://float.tistory.com/314</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;2ca1b262-1437-4a1f-af28-155e5ef1844e&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker Compose 파일에서 Volume(볼륨)을 정의하는 것은 컨테이너의 데이터를 &lt;b&gt;영구적으로 저장&lt;/b&gt;하거나 &lt;b&gt;호스트 시스템과 공유&lt;/b&gt;하기 위해 매우 중요합니다.&lt;br /&gt;볼륨을 정의하지 않으면, 컨테이너가 삭제되거나 재시작될 때 모든 데이터가 사라질 위험이 있습니다. 아래에서는 볼륨을 사용하는 주요 이유를 설명합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본 글은 아래 게시물에서 이어집니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://float.tistory.com/313&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://float.tistory.com/313&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;figure id=&quot;og_1732031426381&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;rabbitmq[4]  Docker를 사용하여 RabbitMQ를 설치하고 설정하는 방법&quot; data-og-description=&quot;Docker를&amp;nbsp;사용하여&amp;nbsp;RabbitMQ를&amp;nbsp;설치하고&amp;nbsp;설정하는&amp;nbsp;방법&amp;nbsp;Docker   Stack을 사용하여 RabbitMQ를 설치 및 설정하는 방법을 소개합니다. RabbitMQ는 Windows, Linux, macOS 등 다양한 환경에서 설치가 가능하지만, &quot; data-og-host=&quot;float.tistory.com&quot; data-og-source-url=&quot;https://float.tistory.com/313&quot; data-og-url=&quot;https://float.tistory.com/313&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c5ZOTP/hyXzRLj5ca/yZPXnzOv5dVdOT8bF09o4K/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/flCH8/hyXzOgJXuy/BG5CR3io8i6oCgC7o6rXrK/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/r2Idq/hyXzRdwjAX/SlfhGKdGEYk2twXK9exVv1/img.png?width=1691&amp;amp;height=748&amp;amp;face=0_0_1691_748&quot;&gt;&lt;a href=&quot;https://float.tistory.com/313&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://float.tistory.com/313&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c5ZOTP/hyXzRLj5ca/yZPXnzOv5dVdOT8bF09o4K/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/flCH8/hyXzOgJXuy/BG5CR3io8i6oCgC7o6rXrK/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/r2Idq/hyXzRdwjAX/SlfhGKdGEYk2twXK9exVv1/img.png?width=1691&amp;amp;height=748&amp;amp;face=0_0_1691_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;rabbitmq[4] Docker를 사용하여 RabbitMQ를 설치하고 설정하는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker를&amp;nbsp;사용하여&amp;nbsp;RabbitMQ를&amp;nbsp;설치하고&amp;nbsp;설정하는&amp;nbsp;방법&amp;nbsp;Docker   Stack을 사용하여 RabbitMQ를 설치 및 설정하는 방법을 소개합니다. RabbitMQ는 Windows, Linux, macOS 등 다양한 환경에서 설치가 가능하지만,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;float.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;데이터 영속성 유지&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;컨테이너 내부에 저장된 데이터는 기본적으로 **비영속적(temporary)**입니다. 컨테이너를 삭제하거나 재배포하면 해당 데이터는 손실됩니다.&lt;br /&gt;이를 방지하기 위해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Volume&lt;/b&gt;을 사용하면 컨테이너 외부에 데이터를 저장할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시: RabbitMQ 데이터 영속성&lt;/b&gt;&lt;br /&gt;RabbitMQ는 메시지 큐 시스템으로, 처리된 메시지와 큐 상태를 유지해야 합니다. 볼륨을 정의하여 데이터를 컨테이너 외부에 저장함으로써 다음과 같은 상황에서도 데이터가 유지됩니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컨테이너가 삭제된 경우&lt;/li&gt;
&lt;li&gt;컨테이너를 업데이트하거나 재시작한 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;호스트 시스템과 데이터 공유&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;볼륨을 통해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;호스트 시스템의 디렉토리&lt;/b&gt;를 컨테이너와 연결할 수 있습니다.&lt;br /&gt;이는 데이터를 관리하거나 백업하는 데 편리하며, 데이터를 직접 수정하거나 읽어야 할 경우 유용합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;예시: YAML에서 볼륨 정의&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;pre id=&quot;code_1731941026953&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;volumes:
  rabbitmq-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /volumes/rabbitMq&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;device: 호스트 시스템에서 실제 데이터를 저장할 디렉토리(/volumes/rabbitMq)를 지정합니다.&lt;/li&gt;
&lt;li&gt;o: bind: 호스트 디렉토리를 컨테이너의 데이터 디렉토리(/var/lib/rabbitmq)와 연결합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 설정을 통해 RabbitMQ 컨테이너에서 발생하는 데이터가 /volumes/rabbitMq에 영구적으로 저장됩니다.&lt;br /&gt;호스트 디렉토리에 접근해 데이터를 직접 확인하거나 백업할 수 있는 이점이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div data-message-model-slug=&quot;gpt-4o&quot; data-message-id=&quot;2ca1b262-1437-4a1f-af28-155e5ef1844e&quot; data-message-author-role=&quot;assistant&quot;&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. &lt;b&gt;데이터 백업 및 복구 용이&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;볼륨에 데이터를 저장하면, &lt;b&gt;호스트 시스템에 저장된 디렉토리&lt;/b&gt;를 통해 데이터 백업과 복구가 쉬워집니다.&lt;br /&gt;이러한 설정은 RabbitMQ의 중요 메시지 데이터와 큐 상태를 안전하게 관리하는 데 필수적입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;5. &lt;b&gt;컨테이너와 애플리케이션의 독립성 보장&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;볼륨을 사용하면 애플리케이션 데이터와 컨테이너를 분리하여, 컨테이너를 삭제하거나 재배포해도 데이터가 영향을 받지 않습니다.&lt;br /&gt;이로 인해 애플리케이션 업데이트, 롤백, 재배포 등의 작업이 훨씬 간단하고 안전해집니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. &lt;b&gt;퍼포먼스 향상&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Docker 볼륨은 호스트 시스템의 파일 공유 메커니즘을 활용하여 파일 읽기/쓰기 속도를 최적화합니다.&lt;br /&gt;특히 bind mount 대신 Docker 네이티브 볼륨 드라이버를 사용하면, IO 성능이 더 좋아질 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;요약: RabbitMQ와 볼륨의 중요성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RabbitMQ와 같은 메시지 브로커는 데이터 무결성과 영속성이 매우 중요합니다.&lt;br /&gt;Docker Compose에서 볼륨을 정의하면 아래의 장점이 있습니다:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 손실 방지&lt;/li&gt;
&lt;li&gt;컨테이너 업데이트 시 데이터 유지&lt;/li&gt;
&lt;li&gt;호스트 시스템과 데이터 공유&lt;/li&gt;
&lt;li&gt;백업 및 복구 용이&lt;/li&gt;
&lt;li&gt;안정적인 서비스 운영 보장&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RabbitMQ 설치 시, 데이터 저장 경로(/var/lib/rabbitmq)를 반드시 볼륨으로 마운트하는 것이 권장됩니다.&lt;br /&gt;이를 통해 RabbitMQ의 메시지 데이터가 안전하게 관리되고, 서비스의 안정성과 신뢰성을 높일 수 있습니다.&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://float.tistory.com/312&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://float.tistory.com/312&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732031503499&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;RabbitMQ 목차&quot; data-og-description=&quot;1. RabbitMQ와 메시지 큐의 이해&amp;nbsp;https://float.tistory.com/309&amp;nbsp;RabbitMQ[1] RabbitMQ와 메시지 큐의 이해: 마이크로서비스를 위한 비동기 통신RabbitMQ와 **메시지 큐(Message Queue)**에 대해 알아보고,&amp;nbsp;마이크로서비&quot; data-og-host=&quot;float.tistory.com&quot; data-og-source-url=&quot;https://float.tistory.com/312&quot; data-og-url=&quot;https://float.tistory.com/312&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/Xueh1/hyXzJT6RmP/loXbXNcmBCyrq1lg0Kv4OK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/gIjps/hyXzU2oZtO/WKr8BgGeoJ0kFWRHfhWU8K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://float.tistory.com/312&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://float.tistory.com/312&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/Xueh1/hyXzJT6RmP/loXbXNcmBCyrq1lg0Kv4OK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/gIjps/hyXzU2oZtO/WKr8BgGeoJ0kFWRHfhWU8K/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;RabbitMQ 목차&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;1. RabbitMQ와 메시지 큐의 이해&amp;nbsp;https://float.tistory.com/309&amp;nbsp;RabbitMQ[1] RabbitMQ와 메시지 큐의 이해: 마이크로서비스를 위한 비동기 통신RabbitMQ와 **메시지 큐(Message Queue)**에 대해 알아보고,&amp;nbsp;마이크로서비&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;float.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>-JUNHEOK-</author>
      <guid isPermaLink="true">https://float.tistory.com/314</guid>
      <comments>https://float.tistory.com/314#entry314comment</comments>
      <pubDate>Mon, 18 Nov 2024 23:45:18 +0900</pubDate>
    </item>
    <item>
      <title>rabbitmq[4]  Docker를 사용하여 RabbitMQ를 설치하고 설정하는 방법</title>
      <link>https://float.tistory.com/313</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Docker를&amp;nbsp;사용하여&amp;nbsp;RabbitMQ를&amp;nbsp;설치하고&amp;nbsp;설정하는&amp;nbsp;방법&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Docker   Stack을 사용&lt;/b&gt;하여 &lt;b&gt;RabbitMQ를 설치 및 설정&lt;/b&gt;하는 방법을 소개합니다. RabbitMQ는 Windows, Linux, macOS 등 다양한 환경에서 설치가 가능하지만, 저는 &lt;b&gt;Linux 환경&lt;/b&gt;에서 &lt;b&gt;Docker &lt;b&gt;Stack&lt;/b&gt;&lt;/b&gt;를 활용해 설정을 진행했습니다.&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래에서는 RabbitMQ를 Docker Swarm 환경에서 YAML 파일을 이용해 설치하고, Traefik으로 라우팅을 설정하는 방법을 상세히 설명합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. Docker Network 생성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령어를 사용하여 네트워크를 생성합니다&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre id=&quot;code_1731940699584&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker network create --driver overlay --attachable rabbotmq-network​&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;--driver overlay: Docker Swarm에서 여러 호스트 간 네트워크를 연결하기 위해 &lt;b&gt;Overlay 네트워크&lt;/b&gt;를 사용합니다.&lt;/li&gt;
&lt;li&gt;--attachable: 컨테이너가 실행 중에 이 네트워크에 연결 가능하도록 설정합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. docker-rabbitmq.yml 파일 구성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 RabbitMQ를 설정하기 위한 YAML 파일입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1731940541095&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;version: '3.9'

networks:
  traefik-network:
    external: true
  rabbitmq-network:
    driver: overlay

volumes:
  rabbitmq-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /volumes/rabbitMq


services:
  rabbitmq-onlyoffice-document:
    image: rabbitmq:management
    volumes:
      - rabbitmq-data:/var/lib/rabbitmq
    environment:
      RABBITMQ_DEFAULT_USER: 
      RABBITMQ_DEFAULT_PASS: 
    networks:
      - traefik-network
      - onlyoffice-network
    healthcheck:
      test: [&quot;CMD&quot;, &quot;rabbitmq-diagnostics&quot;, &quot;-q&quot;, &quot;ping&quot;]
      interval: 10s
      timeout: 5s
      retries: 3
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.hostname == master
      labels:
        - &quot;traefik.enable=true&quot;
        - &quot;traefik.http.routers.rabbit.rule=Host(`ex.domain`)&quot;
        - &quot;traefik.http.routers.rabbit.service=rabbit&quot;
        - &quot;traefik.http.services.rabbit.loadbalancer.server.port=15672&quot;
        - &quot;traefik.http.routers.rabbit.entrypoints=websecure&quot;
        - &quot;traefik.http.routers.rabbit.tls.certresolver=letsencrypt&quot;
        - &quot;traefik.http.routers.rabbit.tls=true&quot;
        - &quot;traefik.http.services.rabbit.loadbalancer.passhostheader=true&quot;
        - &quot;traefik.http.routers.rabbit.middlewares=compresstraefik&quot;

        # RabbitMQ Broker (TCP)
        - &quot;traefik.tcp.routers.rabbitmq-broker.rule=HostSNI(`ex.domain`)&quot;
        - &quot;traefik.tcp.routers.rabbitmq-broker.entrypoints=amqps&quot;
        - &quot;traefik.tcp.services.rabbitmq-broker.loadbalancer.server.port=5672&quot;
        - &quot;traefik.tcp.routers.rabbitmq-broker.tls=true&quot;  # Enable TLS for TCP router&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;구성 요소 설명&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;네트워크 설정&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;traefik-network: 외부에서 접근 가능한 네트워크. Traefik을 통해 라우팅됩니다.&lt;/li&gt;
&lt;li&gt;rabbitmq-network: RabbitMQ와 관련된 내부 네트워크.&lt;b&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;볼륨 설정&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;rabbitmq-data: RabbitMQ 데이터를 저장하기 위한 볼륨입니다.&lt;/li&gt;
&lt;li&gt;driver_opts를 통해 로컬 경로(/volumes/rabbitMq)를 마운트했습니다.&lt;br /&gt;volume 을 사용하는 이유는 아래 블로그에 정리되어 있습니다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure id=&quot;og_1731941297296&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;Docker Compose에서 Volume을 정의하는 이유&quot; data-og-description=&quot;Docker Compose 파일에서 Volume(볼륨)을 정의하는 것은 컨테이너의 데이터를 영구적으로 저장하거나 호스트 시스템과 공유하기 위해 매우 중요합니다.볼륨을 정의하지 않으면, 컨테이너가 삭제되거&quot; data-og-host=&quot;float.tistory.com&quot; data-og-source-url=&quot;https://float.tistory.com/314&quot; data-og-url=&quot;https://float.tistory.com/314&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/x9Apf/hyXzT27PPf/Vv5KCZYUlR4Tfe0drStBt1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bPXrn0/hyXwhKN9Kv/yOqKD2lTjoXo1zrUrQFDfk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://float.tistory.com/314&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://float.tistory.com/314&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/x9Apf/hyXzT27PPf/Vv5KCZYUlR4Tfe0drStBt1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bPXrn0/hyXwhKN9Kv/yOqKD2lTjoXo1zrUrQFDfk/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Docker Compose에서 Volume을 정의하는 이유&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker Compose 파일에서 Volume(볼륨)을 정의하는 것은 컨테이너의 데이터를 영구적으로 저장하거나 호스트 시스템과 공유하기 위해 매우 중요합니다.볼륨을 정의하지 않으면, 컨테이너가 삭제되거&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;float.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;서비스 설정&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;image: RabbitMQ 관리 플러그인이 포함된 공식 Docker 이미지(rabbitmq:management)를 사용합니다.&lt;/li&gt;
&lt;li&gt;environment: RabbitMQ 초기 관리자 계정과 비밀번호를 설정합니다.&lt;/li&gt;
&lt;li&gt;healthcheck: RabbitMQ의 상태를 주기적으로 확인합니다.&lt;/li&gt;
&lt;li&gt;deploy:
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;replicas: 컨테이너 복제본 수를 1개로 설정합니다.&lt;/li&gt;
&lt;li&gt;constraints: master 호스트에서만 실행되도록 제한합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Traefik 설정&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP 라우터: rabbitmq.keystrom.site 도메인으로 RabbitMQ 관리 웹사이트(포트 15672)에 접근합니다.&lt;/li&gt;
&lt;li&gt;TCP 라우터: RabbitMQ 브로커(포트 5672)로 TLS를 사용해 안전한 연결을 제공합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. YAML 파일 배포&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 명령어를 사용하여 YAML 파일을 배포합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1731940863826&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker stack deploy -c docker-rabbitmq.yml rabbitmq&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-c docker-rabbitmq.yml: YAML 파일 지정&lt;/li&gt;
&lt;li&gt;rabbitmq: 배포 스택 이름&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1691&quot; data-origin-height=&quot;748&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccxuoC/btsKMMKbuNs/07HEuqbyXJeFkOKStTYLwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccxuoC/btsKMMKbuNs/07HEuqbyXJeFkOKStTYLwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccxuoC/btsKMMKbuNs/07HEuqbyXJeFkOKStTYLwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccxuoC%2FbtsKMMKbuNs%2F07HEuqbyXJeFkOKStTYLwK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1691&quot; height=&quot;748&quot; data-origin-width=&quot;1691&quot; data-origin-height=&quot;748&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://float.tistory.com/315&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://float.tistory.com/315&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732022498312&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;rabbitmq[5]  RabbitMQ 관리 플러그인 사용법 정리&quot; data-og-description=&quot;RabbitMQ 관리 플러그인은 RabbitMQ의 동작을 직관적으로 이해하고 관리할 수 있도록 돕는 도구입니다.Docker를 사용해 RabbitMQ를 설치했다면, 기본적으로 이 플러그인은 활성화되며 포트 15672에서 작동&quot; data-og-host=&quot;float.tistory.com&quot; data-og-source-url=&quot;https://float.tistory.com/315&quot; data-og-url=&quot;https://float.tistory.com/315&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/q8Kcj/hyXzOnvAdp/I6q186u4w96Pbsh3aq28j0/img.png?width=390&amp;amp;height=167&amp;amp;face=0_0_390_167,https://scrap.kakaocdn.net/dn/vw8Xu/hyXzLqM3AR/h9AdljKcD3U7zWWebj1d61/img.png?width=390&amp;amp;height=167&amp;amp;face=0_0_390_167,https://scrap.kakaocdn.net/dn/c5TnME/hyXzVfS4Gq/dfSsfIC9e2PRkaMKSFvG2k/img.png?width=1328&amp;amp;height=582&amp;amp;face=0_0_1328_582&quot;&gt;&lt;a href=&quot;https://float.tistory.com/315&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://float.tistory.com/315&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/q8Kcj/hyXzOnvAdp/I6q186u4w96Pbsh3aq28j0/img.png?width=390&amp;amp;height=167&amp;amp;face=0_0_390_167,https://scrap.kakaocdn.net/dn/vw8Xu/hyXzLqM3AR/h9AdljKcD3U7zWWebj1d61/img.png?width=390&amp;amp;height=167&amp;amp;face=0_0_390_167,https://scrap.kakaocdn.net/dn/c5TnME/hyXzVfS4Gq/dfSsfIC9e2PRkaMKSFvG2k/img.png?width=1328&amp;amp;height=582&amp;amp;face=0_0_1328_582');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;rabbitmq[5] RabbitMQ 관리 플러그인 사용법 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;RabbitMQ 관리 플러그인은 RabbitMQ의 동작을 직관적으로 이해하고 관리할 수 있도록 돕는 도구입니다.Docker를 사용해 RabbitMQ를 설치했다면, 기본적으로 이 플러그인은 활성화되며 포트 15672에서 작동&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;float.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>-JUNHEOK-</author>
      <guid isPermaLink="true">https://float.tistory.com/313</guid>
      <comments>https://float.tistory.com/313#entry313comment</comments>
      <pubDate>Mon, 18 Nov 2024 23:43:09 +0900</pubDate>
    </item>
    <item>
      <title>RabbitMQ 목차</title>
      <link>https://float.tistory.com/312</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #f4f4f6; text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1. RabbitMQ와 메시지 큐의 이해&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://float.tistory.com/309&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://float.tistory.com/309&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731897905126&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;RabbitMQ[1] RabbitMQ와 메시지 큐의 이해: 마이크로서비스를 위한 비동기 통신&quot; data-og-description=&quot;RabbitMQ와 **메시지 큐(Message Queue)**에 대해 알아보고,&amp;nbsp;마이크로서비스 아키텍처에서 어떻게 활용되는지 공부 및 정리한 내용입니다.&amp;nbsp;RabbitMQ를 이해하기 전에, 먼저 메시지 큐가 무엇인지 간단히 &quot; data-og-host=&quot;float.tistory.com&quot; data-og-source-url=&quot;https://float.tistory.com/309&quot; data-og-url=&quot;https://float.tistory.com/309&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dXL1wV/hyXzH9eaQb/281UU223heIvDffnxKm5Ok/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dGwVfe/hyXzO1Bdsw/YbuH21fCa9aT853K73ha40/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://float.tistory.com/309&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://float.tistory.com/309&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dXL1wV/hyXzH9eaQb/281UU223heIvDffnxKm5Ok/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/dGwVfe/hyXzO1Bdsw/YbuH21fCa9aT853K73ha40/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;RabbitMQ[1] RabbitMQ와 메시지 큐의 이해: 마이크로서비스를 위한 비동기 통신&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;RabbitMQ와 **메시지 큐(Message Queue)**에 대해 알아보고,&amp;nbsp;마이크로서비스 아키텍처에서 어떻게 활용되는지 공부 및 정리한 내용입니다.&amp;nbsp;RabbitMQ를 이해하기 전에, 먼저 메시지 큐가 무엇인지 간단히&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;float.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #f4f4f6; text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. RabbitMQ의 핵심 개념&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;a href=&quot;https://float.tistory.com/310&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://float.tistory.com/310&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731897907540&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;RabbitMQ[2] RabbitMQ의 핵심 개념&quot; data-og-description=&quot;Producer (생산자)Producer는 메시지를 전송하는 애플리케이션입니다.Producer는 Consumer(소비자)에게 직접 메시지를 보내지 않습니다.대신, 메시지를 RabbitMQ 브로커로 전송합니다.Producer는 메시지를 Rabbi&quot; data-og-host=&quot;float.tistory.com&quot; data-og-source-url=&quot;https://float.tistory.com/310&quot; data-og-url=&quot;https://float.tistory.com/310&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bs5e4I/hyXzPMPRQe/B3KF7tigLPazFyBu99NLW1/img.png?width=800&amp;amp;height=314&amp;amp;face=0_0_800_314,https://scrap.kakaocdn.net/dn/bkl4t4/hyXzVM3XZM/kLkKSRMJI8BeO36whyfdvK/img.png?width=800&amp;amp;height=314&amp;amp;face=0_0_800_314,https://scrap.kakaocdn.net/dn/cQL1uI/hyXzRqlKph/gZ8EkN7affZE0wItuZS5MK/img.png?width=1016&amp;amp;height=399&amp;amp;face=0_0_1016_399&quot;&gt;&lt;a href=&quot;https://float.tistory.com/310&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://float.tistory.com/310&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bs5e4I/hyXzPMPRQe/B3KF7tigLPazFyBu99NLW1/img.png?width=800&amp;amp;height=314&amp;amp;face=0_0_800_314,https://scrap.kakaocdn.net/dn/bkl4t4/hyXzVM3XZM/kLkKSRMJI8BeO36whyfdvK/img.png?width=800&amp;amp;height=314&amp;amp;face=0_0_800_314,https://scrap.kakaocdn.net/dn/cQL1uI/hyXzRqlKph/gZ8EkN7affZE0wItuZS5MK/img.png?width=1016&amp;amp;height=399&amp;amp;face=0_0_1016_399');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;RabbitMQ[2] RabbitMQ의 핵심 개념&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Producer (생산자)Producer는 메시지를 전송하는 애플리케이션입니다.Producer는 Consumer(소비자)에게 직접 메시지를 보내지 않습니다.대신, 메시지를 RabbitMQ 브로커로 전송합니다.Producer는 메시지를 Rabbi&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;float.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #f4f4f6; text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;3. RabbitMQ의 아키텍처&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://float.tistory.com/311&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://float.tistory.com/311&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731897898106&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;RabbitMQ[3] RabbitMQ 아키텍처&quot; data-og-description=&quot;일반적인 메시징 시스템 아키텍처우선, 일반적인 메시징 시스템 아키텍처를 살펴봅시다.&amp;nbsp;&amp;nbsp;Producer(생산자): 메시지를 생성하고 보냅니다.Consumer(소비자): 메시지를 읽어들이고 처리합니다.Message &quot; data-og-host=&quot;float.tistory.com&quot; data-og-source-url=&quot;https://float.tistory.com/311&quot; data-og-url=&quot;https://float.tistory.com/311&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/1LI4n/hyXzTBPubg/NNzljfnTk7y5uy97JXyC6K/img.png?width=713&amp;amp;height=223&amp;amp;face=0_0_713_223,https://scrap.kakaocdn.net/dn/btFeeh/hyXzPe7UZZ/ld1LlApbveorKb0vu3wkZ1/img.png?width=713&amp;amp;height=223&amp;amp;face=0_0_713_223,https://scrap.kakaocdn.net/dn/bzMxZf/hyXzNajmrn/40F8QzGfoc8XoJSj0LXRAk/img.png?width=894&amp;amp;height=408&amp;amp;face=0_0_894_408&quot;&gt;&lt;a href=&quot;https://float.tistory.com/311&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://float.tistory.com/311&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/1LI4n/hyXzTBPubg/NNzljfnTk7y5uy97JXyC6K/img.png?width=713&amp;amp;height=223&amp;amp;face=0_0_713_223,https://scrap.kakaocdn.net/dn/btFeeh/hyXzPe7UZZ/ld1LlApbveorKb0vu3wkZ1/img.png?width=713&amp;amp;height=223&amp;amp;face=0_0_713_223,https://scrap.kakaocdn.net/dn/bzMxZf/hyXzNajmrn/40F8QzGfoc8XoJSj0LXRAk/img.png?width=894&amp;amp;height=408&amp;amp;face=0_0_894_408');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;RabbitMQ[3] RabbitMQ 아키텍처&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;일반적인 메시징 시스템 아키텍처우선, 일반적인 메시징 시스템 아키텍처를 살펴봅시다.&amp;nbsp;&amp;nbsp;Producer(생산자): 메시지를 생성하고 보냅니다.Consumer(소비자): 메시지를 읽어들이고 처리합니다.Message&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;float.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #f4f4f6; text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;4. Docker를 사용하여 RabbitMQ를 설치하고 설정하는 방법&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://float.tistory.com/313&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://float.tistory.com/313&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1731941592752&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;rabbitmq[4]  Docker를 사용하여 RabbitMQ를 설치하고 설정하는 방법&quot; data-og-description=&quot;Docker를&amp;nbsp;사용하여&amp;nbsp;RabbitMQ를&amp;nbsp;설치하고&amp;nbsp;설정하는&amp;nbsp;방법&amp;nbsp;Docker   Stack을 사용하여 RabbitMQ를 설치 및 설정하는 방법을 소개합니다. RabbitMQ는 Windows, Linux, macOS 등 다양한 환경에서 설치가 가능하지만, &quot; data-og-host=&quot;float.tistory.com&quot; data-og-source-url=&quot;https://float.tistory.com/313&quot; data-og-url=&quot;https://float.tistory.com/313&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bryVIp/hyXzMpimyb/u1H3nktuXFL9jjgHlTtskk/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/bUkyEq/hyXzNax2qz/y9IOqspirmrKOJGifkF2u0/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/cF7KRy/hyXzVGDvUE/gdZspXAllibRSfyVqoff1K/img.png?width=1691&amp;amp;height=748&amp;amp;face=0_0_1691_748&quot;&gt;&lt;a href=&quot;https://float.tistory.com/313&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://float.tistory.com/313&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bryVIp/hyXzMpimyb/u1H3nktuXFL9jjgHlTtskk/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/bUkyEq/hyXzNax2qz/y9IOqspirmrKOJGifkF2u0/img.png?width=800&amp;amp;height=353&amp;amp;face=0_0_800_353,https://scrap.kakaocdn.net/dn/cF7KRy/hyXzVGDvUE/gdZspXAllibRSfyVqoff1K/img.png?width=1691&amp;amp;height=748&amp;amp;face=0_0_1691_748');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;rabbitmq[4] Docker를 사용하여 RabbitMQ를 설치하고 설정하는 방법&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Docker를&amp;nbsp;사용하여&amp;nbsp;RabbitMQ를&amp;nbsp;설치하고&amp;nbsp;설정하는&amp;nbsp;방법&amp;nbsp;Docker   Stack을 사용하여 RabbitMQ를 설치 및 설정하는 방법을 소개합니다. RabbitMQ는 Windows, Linux, macOS 등 다양한 환경에서 설치가 가능하지만,&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;float.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #f4f4f6; text-align: center;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;5. RabbitMQ&amp;nbsp;관리&amp;nbsp;플러그인&amp;nbsp;사용법&amp;nbsp;정리&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://float.tistory.com/315&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://float.tistory.com/315&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1732022520364&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;rabbitmq[5]  RabbitMQ 관리 플러그인 사용법 정리&quot; data-og-description=&quot;RabbitMQ 관리 플러그인은 RabbitMQ의 동작을 직관적으로 이해하고 관리할 수 있도록 돕는 도구입니다.Docker를 사용해 RabbitMQ를 설치했다면, 기본적으로 이 플러그인은 활성화되며 포트 15672에서 작동&quot; data-og-host=&quot;float.tistory.com&quot; data-og-source-url=&quot;https://float.tistory.com/315&quot; data-og-url=&quot;https://float.tistory.com/315&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/q8Kcj/hyXzOnvAdp/I6q186u4w96Pbsh3aq28j0/img.png?width=390&amp;amp;height=167&amp;amp;face=0_0_390_167,https://scrap.kakaocdn.net/dn/vw8Xu/hyXzLqM3AR/h9AdljKcD3U7zWWebj1d61/img.png?width=390&amp;amp;height=167&amp;amp;face=0_0_390_167,https://scrap.kakaocdn.net/dn/c5TnME/hyXzVfS4Gq/dfSsfIC9e2PRkaMKSFvG2k/img.png?width=1328&amp;amp;height=582&amp;amp;face=0_0_1328_582&quot;&gt;&lt;a href=&quot;https://float.tistory.com/315&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://float.tistory.com/315&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/q8Kcj/hyXzOnvAdp/I6q186u4w96Pbsh3aq28j0/img.png?width=390&amp;amp;height=167&amp;amp;face=0_0_390_167,https://scrap.kakaocdn.net/dn/vw8Xu/hyXzLqM3AR/h9AdljKcD3U7zWWebj1d61/img.png?width=390&amp;amp;height=167&amp;amp;face=0_0_390_167,https://scrap.kakaocdn.net/dn/c5TnME/hyXzVfS4Gq/dfSsfIC9e2PRkaMKSFvG2k/img.png?width=1328&amp;amp;height=582&amp;amp;face=0_0_1328_582');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;rabbitmq[5] RabbitMQ 관리 플러그인 사용법 정리&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;RabbitMQ 관리 플러그인은 RabbitMQ의 동작을 직관적으로 이해하고 관리할 수 있도록 돕는 도구입니다.Docker를 사용해 RabbitMQ를 설치했다면, 기본적으로 이 플러그인은 활성화되며 포트 15672에서 작동&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;float.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>-JUNHEOK-</author>
      <guid isPermaLink="true">https://float.tistory.com/312</guid>
      <comments>https://float.tistory.com/312#entry312comment</comments>
      <pubDate>Mon, 18 Nov 2024 11:46:03 +0900</pubDate>
    </item>
    <item>
      <title>RabbitMQ[3] RabbitMQ 아키텍처</title>
      <link>https://float.tistory.com/311</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;일반적인 메시징 시스템 아키텍처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 일반적인 메시징 시스템 아키텍처를 살펴봅시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;223&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7VebA/btsKNscnLf6/d0fSt306KFi8D3lrBcks90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7VebA/btsKNscnLf6/d0fSt306KFi8D3lrBcks90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7VebA/btsKNscnLf6/d0fSt306KFi8D3lrBcks90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7VebA%2FbtsKNscnLf6%2Fd0fSt306KFi8D3lrBcks90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;713&quot; height=&quot;223&quot; data-origin-width=&quot;713&quot; data-origin-height=&quot;223&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Producer(생산자)&lt;/b&gt;: 메시지를 생성하고 보냅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Consumer(소비자)&lt;/b&gt;: 메시지를 읽어들이고 처리합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Message Broker(메시지 브로커)&lt;/b&gt;: Producer와 Consumer 사이에서 메시지를 중계합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;흐름&lt;/b&gt;: Producer는 메시지를 브로커로 보내고, Consumer는 브로커에서 메시지를 읽습니다.&lt;br /&gt;이것이 &lt;b&gt;일반적인 메시징 시스템의 구조&lt;/b&gt;입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;RabbitMQ 메시징 시스템 아키텍처&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RabbitMQ 아키텍처에서는 위 구조에 추가적으로 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Exchange(교환기)&lt;/b&gt;&lt;/span&gt;라는 컴포넌트가 있습니다.&lt;br /&gt;RabbitMQ의 흐름은 다음과 같습니다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;292&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkZExw/btsKMZaoSwm/Fb3YGW3q6KusAVZys7ymEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkZExw/btsKMZaoSwm/Fb3YGW3q6KusAVZys7ymEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkZExw/btsKMZaoSwm/Fb3YGW3q6KusAVZys7ymEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkZExw%2FbtsKMZaoSwm%2FFb3YGW3q6KusAVZys7ymEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;995&quot; height=&quot;292&quot; data-origin-width=&quot;995&quot; data-origin-height=&quot;292&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Producer&lt;/b&gt;가 메시지를 &lt;b&gt;Exchange&lt;/b&gt;에 보냅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Exchange&lt;/b&gt;는 메시지를 적절한 Queue(큐)로 라우팅합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Consumer&lt;/b&gt;는 해당 &lt;b&gt;Queue&lt;/b&gt;에서 메시지를 읽어 처리합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;기본 구조&lt;/b&gt;는 간단하지만, 복잡한 애플리케이션에서는 여러 개의 큐를 생성해야 할 수 있습니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RabbitMQ 아키텍처(다중 큐)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RabbitMQ에서 여러 큐를 사용하는 아키텍처는 아래와 같은 구조를 가집니다:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;408&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bdu8j/btsKL2zdc8P/6HLWJScEMTlAD6HtTZk5B0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bdu8j/btsKL2zdc8P/6HLWJScEMTlAD6HtTZk5B0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bdu8j/btsKL2zdc8P/6HLWJScEMTlAD6HtTZk5B0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBdu8j%2FbtsKL2zdc8P%2F6HLWJScEMTlAD6HtTZk5B0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;894&quot; height=&quot;408&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;408&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Producer는 &lt;b&gt;Exchange&lt;/b&gt;에 메시지를 보냅니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Exchange&lt;/b&gt;는 Routing Key(라우팅 키)를 사용해 메시지를 적절한 큐로 라우팅합니다.&lt;/li&gt;
&lt;li&gt;Consumer는 각각의 큐에서 메시지를 읽어 처리합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;중요 포인트&lt;/b&gt;: Exchange는 RabbitMQ 아키텍처에서 핵심적인 역할을 하며, 메시지를 올바른 큐로 라우팅합니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;예시: RabbitMQ 아키텍처 동작 원리&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예제를 통해 동작 방식을 살펴봅시다.&lt;br /&gt;RabbitMQ 아키텍처에 &lt;b&gt;Queue1&lt;/b&gt;, &lt;b&gt;Queue2&lt;/b&gt;, &lt;b&gt;Queue3&lt;/b&gt;가 있다고 가정해 보겠습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;메시지를 Queue3으로 보내기&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Producer는 &lt;b&gt;Routing Key: 3&lt;/b&gt;을 포함한 메시지를 &lt;b&gt;Exchange&lt;/b&gt;에 보냅니다.&lt;/li&gt;
&lt;li&gt;Exchange는 이 &lt;b&gt;Routing Key: 3&lt;/b&gt;을 확인하고 메시지를 &lt;b&gt;Queue3&lt;/b&gt;으로 라우팅합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;메시지를 Queue1으로 보내기&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Producer는 &lt;b&gt;Routing Key: 1&lt;/b&gt;을 포함한 메시지를 &lt;b&gt;Exchange&lt;/b&gt;에 보냅니다.&lt;/li&gt;
&lt;li&gt;Exchange는 &lt;b&gt;Routing Key: 1&lt;/b&gt;을 확인하고 메시지를 &lt;b&gt;Queue1&lt;/b&gt;으로 라우팅합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  &lt;b&gt;Binding(바인딩)&lt;/b&gt;:&lt;br /&gt;Exchange와 Queue 간의 연결(바인딩)은 &lt;b&gt;Routing Key&lt;/b&gt;를 통해 설정됩니다.&lt;br /&gt;이 연결이 있어야 Exchange가 메시지를 올바른 Queue로 라우팅할 수 있습니다.&lt;/p&gt;</description>
      <author>-JUNHEOK-</author>
      <guid isPermaLink="true">https://float.tistory.com/311</guid>
      <comments>https://float.tistory.com/311#entry311comment</comments>
      <pubDate>Mon, 18 Nov 2024 11:43:50 +0900</pubDate>
    </item>
  </channel>
</rss>