[ํ์คํ] ZMQ Pattern
2023. 4. 18. 00:43ใComputerScience/FullStackProgramming
ZMQ Request-Reply pattern
- ‘Hello World’ client/server example
- Client sends “Hello” to the server
- Server replies with “World”
- 1:1 TCP echo ์๋ฒ์ ์ ์ฌ
- Synchronous REQ-REP socket
- ์ดํ๋ฆฌ์ผ์ด์ ์ ๋๊ธฐ, ํต์ ์ ๋ํ ๋ถ๋ถ์ ์์์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋จ
- Client issues send() and then recv(), in a loop
- ํด๋ผ์ด์ธํธ๊ฐ ์ ํํ ํจํด - ๋ฆฌํ์คํธ ํจํด / ์๋ฒ๋ ๋ฆฌํ๋ผ์ด ํจํด
- Doing any other sequence (e.g., sending two messages in a row) will result in a return code of -1 from the send or recv call
< server >
- basic class -> import zmq
- ์ผ์ข ์ ZMQ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๊ฐ์ฒด ์์ฑ
- ์์ผ ํ์ ์ REP (์๋ต)
- ์๋ฒ๋ฅผ ๋ฐ์ธ๋ .bind ์ํจ๋ค -> ์๋ฒ(socket)์ด ์ด์๋๊ณ , ๋ฐ์ธ๋ ์ํด (tcp์ ์ ์ฌ)
- 1์ด ์ฌ๋ ํจ์๋ฅผ ์ฐ๋ ค๊ณ import time
< client >
- client๋ request pattern
context.socket(zmq.REQ) - ์๋ฒ์ bind์ ์์ํ๋ connect
- app ์ด ๋๊ธฐ๋ผ๋ ์ด์
-> ๋๊ธฐ ๋ฐฉ์์ผ๋ก ์๋ฒ์ ๊ฐ์ ๊ธฐ๋ค๋ฆฌ๊ณ , ์ถ๋ ฅํ๊ณ , ๋ฐ๋ณต
- Autonomous 1:N REQ-REP socket
- You could throw thousands of clients at this server, all at once, and it would continue to work happily and quickly
- tcp server - multi-thread -> ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ๊ตฌํ ์ผ์ผ์ด ํด์ผ ํจ
- Example:
- Single server : lec-05-prg-01-req-rep-basic-server.py (NO modification)
- Three clients : lec-05-prg-02-req-rep-basic-client.py
- ์๋ฒ๋ฅผ ์์ ํ์ง ์๊ณ , ํด๋ผ์ด์ธํธ 3๊ฐ ๋์์ ๋ถ์ฌ๋ฒ๋ฆฐ๋ค.
- ํต์ ์ ๋ํ ๋น๋๊ธฐ ์ฒ๋ฆฌ, ๋ฉํฐ ์ค๋ ๋ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ค.
- ๊ฐ๋ฐ์๊ฐ ๊ตฌํํด์ผ ํ๋ ๋ก์ง์ ์์์ ์ฒ๋ฆฌํ ๊ฒ!
ZMQ Publish-Subscribe pattern
- Connects a set of publishers to a set of subscribers
- One-way data distribution pattern
- Server pushes updates to a set of clients
- stableํ ์ ๋ฅผ ์๋ฒ(bind)๋ก ์ก๋๋ค - ํด๋น ํจํด์์๋ PUB
- ํ๋์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ ๋, ์ฌ๋ฌ ๋ช ์ subscriber์๊ฒ ๋ณด๋ด๋ ๊ฒ
- PUB-SUB weather broadcasting example
- Server pushes out weather updates consisting of a zip code, temperature, and relative humidit
- Client listens to the stream of updates and grabs anything to do with a specified zip code
- zip_filter at setsockopt_string (line number 21)
- Client must set a subscription using setsockopt() and SUBSCRIBE, as in line number 21
- ๋ ์จ ์๋ฒ๋ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ์ง์ญ์ ์ ๋ณด๋ฅผ ๋ณด๋ธ๋ค
- ์ค๋งํธํฐ (ํด๋ผ์ด์ธํธ) ๋ณธ์ธ์ ์์น ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ์ ํ์ ์ผ๋ก ์ ๋ณด๋ฅผ ๋ฐ๋๋ค
< server >
- ํด๋ผ์ด์ธํธ์ ์๋ต์ ๋ฐ๋ ์ฝ๋ X
- ๋ฉ์ธ์ง๋ฅผ ์ ๋ฌํ๊ธฐ๋ง ํ๋ฉด ๋จ
- ๊ฐ๋ฐ์๊ฐ ์ฒ๋ฆฌํ ํ์๊ฐ ์๋ค -> zmp์๊ฒ ๋ณด๋ผ ์ ๋ณด๋ง ์ฃผ๋ฉด, ์์์ ์ฒ๋ฆฌํจ
- socket type - PUB, bind() -> server ์ญํ
- ์ฐํธ ๋ฒํธ, ์จ๋, ์ต๋๋ฅผ ๋๋ค์ผ๋ก ์์ฑํ์ฌ ๋ณด๋ด๋ ์ํฉ
< client >
- SUB ์ญํ ์ ๋งก๋๋ค
- ์ฌ์ฉ์๊ฐ ํญ๋ชฉ์ ์ฃผ๋ฉด, sys.argv -> zip_filter์ ๋ด๊น
- zip_filter๋ฅผ ํตํด ์ํ๋ ์ ๋ณด๋ง ๋ฐ์ ์ ์๋ค.
- PUB-SUB socket characteristics
- PUB-SUB socket pair is asynchronous
- PUB-SUB socket is unidirectional
- ์ดํ๋ฆฌ์ผ์ด์ ์ง๋ ์ฌ๋ ์ ์ฅ์์, ๋ด์ฉ๋ง ์ดํดํ๊ณ ์ฝ๋๋ ๊ตฌํํ ํ์ ์์ด zmp ์ฐ๋ฉด ๋จ
- ์๋ฒ๋ ์์์ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌ๋จ
- Client does recv(), in a loop (or once if that’s all it needs).
Trying to send a message to a SUB socket will cause an error - server - send - PUB / client - receive - SUB (๋ฐ๋๋ฉด ์๋ฌ ๋ฐ์)
- Similarly, the service does send() as often as it needs to, but must not do recv() on a PUB socket.
Publish-Subscribe with Pipeline pattern
- Pipeline pattern
- ๋ณ๋ ฌ ์ฒ๋ฆฌ -> ํ์ดํ๋ผ์ธ์ด๋ผ๋ ์ฉ์ด ์ฌ์ฉ
- Connects nodes in a fan-out/fan-in pattern that can have multiple steps and loops
- Parallel task distribution and collection pattern
- ๋ถ์ฐ ์ฒ๋ฆฌ์์ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์ง๋ ๊ฒฝ์ฐ ๋ง๋ค.
- push ๋ฐ์ด๋ด๋ ๊ฒ
pull ๋น๊ธฐ๋ ๊ฒ - ์์
์ 3๊ฐ์ ์ผ๊พผ์๊ฒ ๋ฟ๋ฆฐ ํ, ํ๋๋ก ๋ชจ์ผ๊ธฐ
๋น ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฑ๋ฑ ๋ถ์ฐ ์ฒ๋ฆฌ์์ ๋ง์ด ํ์ฉ
- push ๋ฐ์ด๋ด๋ ๊ฒ
- PUB/SUB with PUSH/PULL example
- Server
- PUB & PULL ๊ธฐ๋ฅ
- ๊ตฌ๋์ PUBlish ๋ฐ PULL ์๋ฒ ๊ธฐ๋ฅ์ ํ์ฑํ ํจ
- Client๋ค์ด ์ฃผ๊ธฐ์ ์ผ๋ก ๋ณด๊ณ ํ๋ ์ํ ์ ๋ณด๋ฅผ PULL ํ ํ, ๋ค์ ๋ชจ๋ Client๋ค์ PUBlish ํจ
- Client
- SUB & PUSH ๊ธฐ๋ฅ
- ์ฃผ๊ธฐ์ ์ผ๋ก ์์ ์ ์ํ ์ ๋ณด๋ฅผ Server์ PUSH ํจ
- Server๊ฐ PUBlishํ (๋ณธ์ธ ํฌํจ) ์ ์ฒด Client๋ค์ ์ํ๋ฅผ SUBscribe ๊ธฐ๋ฅ์ ํตํด์ ์์ ํจ
- state๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋, ์ฑํ ๊ณผ ๋ค๋ฅผ ๋ฐ๊ฐ ์๋ค
- Server
- ์ค๋ ๋ฒํฐ๋ ์ ๋ฅผ ์๋ฒ๋ก ์์น์ํจ๋ค
- ์ด์๋ค ์ฃฝ์๋ค, ๋์ ์ธ ์ -> ํด๋ผ์ด์ธํธ
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์๊ฒ state๋ฅผ ๋ณด๋
ex) ๋ณธ์ธ์ด ๋ก๊ทธ์ธ ์ํ๋ผ๋ ๊ฒ์ ์๋ฒ์๊ฒ ์๋ฆผ
PC ๋ฒ์ ์นดํก or ๋ค์ดํธ์จ ๋ฑ๋ฑ -> ์ํ ์ ๋ณด: active or inactive
ํ ์๊ฐ ๋์ ์๋์ ๋ฐ์ง ์๊ฒ ๋ค ๋ฑ๋ฑ ์ด๋ฌํ ์ํ๋ฅผ ๋ด์์ ๋ณด๋ด๋ ๊ฒ - ํด๋ผ์ด์ธํธ๊ฐ ๋ณธ์ธ์ ์ ๋ณด๊ฐ ๋ฐ๋์์ ๊ฒฝ์ฐ -> state update
- ์ด๋ ๊ฒ ๋ฐ์ ์ํ๋ฅผ, ์๋ฒ๊ฐ sub ์ ๋คํํ
๋ณด๋ด์ฃผ๋ ๊ฒ
๋๊ตฌ๋๊ตฌ๋ ์ง๊ธ ์กํฐ๋ธํ์ง ์์ (์๋ฆฌ ๋น์ ์ํ์ผ)
ZMQ Dealer-Router pattern
- Asynchronous version of REQ-REP pattern
- N-to-1 architecture where various clients talk to a single server, and do this asynchronously
- 1-to-N use case where one server talks asynchronously to multiple workers
- N๊ฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ 1๊ฐ์ ์๋ฒ๊ฐ ๋ฐ์ผ๋, ๋๊ตฌ์๊ฒ ๋๋ ค์ฃผ์ด์ผ ํ๋์ง
- Asynchronous version of REQ-REP pattern -> ๋๋ ์ด ๋ฌธ๊ตฌ๊ฐ ๊ฐ์ฅ ์ ์ดํด๋๋ค !
- Clients connect to the server and send requests
- For each request, the server sends 0 or more replies
- Clients can send multiple requests without waiting for a reply -> async
- Servers can send multiple replies without waiting for new requests -> async
Asynchronous Client/Server example
- ํด๋ผ์ด์ธํธ๋ค์ ์์ฒญ์ ๋ฐ๋ ๊ด๋ฌธ, load balancer -> ๋ผ์ฐํฐ
- ์ด ์๋ฒ๋ค ์ค์ ๋๊ฐ ์ข ๋ stableํ๋ -> ๋๊ฐ ์๋ฒ๋๊ฐ ์๋๋ค, ๋ชจ๋ ๋ค ์๋ฒ์!
- ๋ค์ ์๋ ์ผ๊พผ๋คํํ
์ ๋ฌ
์ผ ์ ๋ฌด ๋ถ๋ฐฐ ํ๊ณ , ๋๋๋ฉด ์ทจํฉ
์๋ ์๋ตํ ์ ๋คํํ ๋ค์ ์ ๋ฌ
- ํ์ํ ๋ ํ์ํ ๋งํผ
worker๋ฅผ ๋๋ฆฌ๊ฑฐ๋ ์ค์ด๋ ํ์ -> ๊ฐ๋ฐ์์ ๋ชซ - multi-threading
- ์์ปค๋ฅผ ๋์ฐ๋ ๊ธฐ๋ฅ์ ์ง์ ํด์ผ ํจ
- zmq๊ฐ ํด์ฃผ๋ ๊ฑด ํต์ ๊ธฐ๋ฅ์ ๊ตญํํ ๊ฒ!
- application ์์ญ์ ์กฐ์์ ๊ฐ๋ฐ์์ ๋ชซ
Dealer-Router pattern with Multi-thread Client
- Separe send and recv features in a client
- Enhanced version of lec-05-prg-10-dealer-router- async-client.py
- Recv feature in a client is impelled as a thread
- ๋ฆฌ์๋ธ ํธ๋ค๋ฌ๋ฅผ thread ํ
zmq -> ํด๋ผ์ด์ธํธ, ์๋ฒ, ์์ปค -> ์์ปค๋ฅผ ์กฐ์ ๊ฐ๋ฅ
ํด๋ผ์ด์ธํธ๋ค๋ fulled flex๋ก ๋์ํ ์ ์๊ฒ ๋ง๋ ๊ฒ
Dirty P2P example
- Self-Healing P2P network with brute-force discovery
- Just for learning purpose (too heavy)
- Connect to every IP address in the room
- If your network segment is 192.168.55.x, for instance, you do this:
- ์๋ฒ ์์ด P2P๊ฐ ๊ตฌํ๋๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
- ํ์ฌ ๋คํธ์ํฌ์ ์๋ ๋ชจ๋ ์ปดํจํฐ๋ฅผ ๋ค ๋ถ์ด๋ ๊ฒ
255 * 255 ๊ฐ connection์ ๋ง๋๋ ๊ฒ -> ๊ฐ ๋ ธํธ๋ถ์ด 1: 255 - ๋ด๊ฐ ๋ณด๋ด๊ณ ์ถ์ ๋, ๋ฉ์ธ์ง๋ฅผ 255ํ ์ ์ก
์์ผ์ ๋ด ํ๋ก๊ทธ๋จ ํผ์ 255๊ฐ ์ถ
์ด์์ฒด์ ๊ฐ 255๊ฐ์ ์์ผ์ ๋์๋ค๋ฐ์ ์ผ๋ก ์ฐ๋ค? -> ๋ฉ๋ชจ๋ฆฌ or ํ๋ก์ธ์ค ๋ถํ, ๋จ์ ๋ฌด์ํ ๋ฐฉ๋ฒ - WebRTC๋ฅผ ํ์ฉํ p2p ํต์ -> ์น ๋ธ๋ผ์ฐ์ ์์์ ๋์๊ฐ๋ API
- ์ ๋ฌด์ ๊ณต์ ๊ธฐ๋ฅผ ๋์ด๊ฐ๋ ์ ๋ค์ ๋ต์ด ์๋ ๊ฒ
-> ์ ๋ฌด์ ๊ณต์ ๊ธฐ๋ฅผ ๋์ด๊ฐ๋ ค๋ฉด ํธ๋ํฝ์ด ๋๋ฌด ๋ง์์, ๋คํธ์ํฌ ๋ง๊ฐ์ง - 24์๊ฐ ์ด์์๋ ์๋ฒ๋ ์์ง๋ง,
255๊ฐ์ peer node์ค ํ๋๊ฐ ์ด๋ ๋งค๊ณ , ์ ์ ์๋ฒ ๊ธฐ๋ฅ์ ๋งก๋๋ค.
-> ์กฐ์ ํ๋ ์ ๊ฐ ํ๋ ๋ธ -> ์ด ๋ ธ๋์ ์งํ ํ์ ํต์ ์ด ์ด๋ฃจ์ด์ง
- ํ์ฑํ ๋ ์๋ฒ ์ญํ ์ ํ๋ ์ ๊ฐ ์๋์ง check
- ๋น์ฝ ํจ์๋ฅผ ์ค๋ ๋๋ก ๋์์ ๋ณ๋ ฌ ์์
- IP์ฃผ์์ ์์ด๋๋ฅผ ํตํด ๋ฑ๋ก
- ์ด์์๋ ์๋ฒ๊ฐ ์์ด์?
์ด์๋์ 1๋ฒ๋ถํฐ 255 ๊น์ง, ํ์ฌ ์ด ๋คํธ์ํฌ ์์, ์๋ฒ ๊ธฐ๋ฅ์ ์ํํ๊ณ ์๋ ์ (๋น์ฝ)๊ฐ ์๋์ง ์ฐพ๋๊ฒ
๋น์ฝ์ด 1์ด ๋จ์๋ก ์ ๋ณด๋ฅผ ๋ฟ๋ฆฌ๋๊น, ์ปค๋ฅ์ ํ๊ณ ๋น์ฝ ๋ณด๋ด๋? -> 2์ด ๊ธฐ๋ค๋ฆฌ๊ณ ์๋๋ฉด ์ฐ๊ฒฐ ๋๊ณ
๋ง์ฝ์ ๋น์ฝ ์ ๋ณด๊ฐ ์ค๋ฉด -> ๋ณธ์ธ์ด ์๋ฒ ์ญํ ์ ํ ํ์๊ฐ X
๋น์ฝ ์ญํ ์ด ์๋ฌด๋ ์๋ค๋ฉด -> ์๋ฒ๊ฐ ์๋ค -> ๋ณธ์ธ์ด ์๋ฒ๊ฐ ๋์ด์ผ ํ๋ค.
- ๋๊ตฐ๊ฐ ์ด๋๋ฅผ ๋งค๋ ๊ฒฝ์ฐ
์๋ฒ ๊ธฐ๋ฅ์ ๋์ฐ๋ ๋ฐ, ํ์์ ์ธ ๊ธฐ๋ฅ์ ๋ช ๊ฐ ๋ง๋ฆ - beacon - ์ฃผ๊ธฐ์ ์ผ๋ก ์ฃผ๊ณ ๋ฐ๋ ์ ๋ณด๋ฅผ ๋น์ฝ์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
256๊ฐ์ ๋ ธ๋ ์ค, ๋๊ตฐ๊ฐ ์ด๋๋ฅผ ๋งค๊ณ , ๋ณธ์ธ์ด ์๋ฒ ์ญํ ์ ํด์ฃผ๊ธฐ๋ก ํ๋ค๋ฉด
๋ค๋ฅธ ์ ๋ค์ ๋ชจ๋ฅด๋๊น, ๋ด๊ฐ ์์ ์๋ฒ ์ญํ ์ ํด์ค๊ฒ! ์ด๋ฐ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ๊ฒ
temperalํ server๊ฐ activate ๋์๋๋ฐ, ๊ทธ๊ฒ ๋์ผ! ๋ฟ๋ฆฌ๋ ๊ฒ - 1์ด ์ฌ๊ณ , ๋ฉ์ธ์ง๋ก ip ์ฃผ์ ๋ณด๋ด์ค
- ์ฐ๊ฒฐ ๋๋์ง ํ์ธ -> ์๋๋ฐฉ์ด ์๋์ง ํ์ธํ๊ธฐ ์ํด, ๋ฑ๋ก ์๋ฒ ํ์
์ด ๋คํธ์ํฌ ์์ ์ด์์๋ peer node๋ค์ด ๋๊ตฌ์ธ์ง ์์์ผ์ง
p2p node๊ฐ ์ด์๋๋ฉด, ๋น์ฝ(์๋ฒ) ํ์ธ, ๋๋ ๋๊ตฌ์ธ์ง ์๋ฒ์๊ฒ ๋ฑ๋ก - ์๋ฒ ๊ธฐ๋ฅ์ ํ๋ ์ ๋ reply (reply request pattern์ผ๋ก ๊ตฌํ๋จ)
- user manager
Node๊ฐ ์ด์๋ฌ์ ๋, ์ํํ (์์ ์๋ฒ)ํํ ํด๋ผ์ด์ธํธ id, ip address ์ฃผ๋ ๊ฒ
์ฆ, user ๋ฑ๋ก์ ํ๋ ๊ณผ์ ๊ณผ ๋งค์ธ์ง ๋ณด๋ด๋ ๊ธฐ๋ฅ์ ๋ถ๋ฆฌํจ!
- ๋ชจ๋ ์๋ฒ์ ๋ถ์๋ค (๋๊ฐ ์๋ฒ์ธ์ง ์๊ณ , ๋ณธ์ธ์ ์ ๋ณด๋ฅผ ๋ฑ๋กํ์ผ๋)
์๋ฒ๋ฅผ ํตํด ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉด ๋๋ค. - pub ํํ๋ก ๋ฟ๋ฆฌ๊ณ , pull๋ก ๊ฐ์ ธ์ด
- ๋ฉ์ธ์ง ๋ฐ๊ณ , ํ๋ฉด์ ์ถ๋ ฅํ๊ณ , ํต์ ์์ ์๋ ์ ๋คํํ ๋ฟ๋ฆผ (-> ๋ฐฉ์ก์ ํจ) -> ๋ฌดํ ๋ฐ๋ณต
- ์ผ๋ฐ์ ์ธ ์ฑํ
ํ๋ก๊ทธ๋จ๊ณผ ์ ์ฌํ๊ฒ p2p๋ ๊ตฌํ๋จ
24์๊ฐ ์ด์์๋ ์ ๊ฐ ์๋ฒ๊ฐ ๋์๋ค๋ฉด, ์ด๋ฒ์๋ ๋น์ฝ ๊ธฐ๋ฅ
- ๊ฐ์ ํ ์
- ๊ฐ์ ์ ๊ด๋ฆฌ - ์ ๋ฐ ๋ฐฉ์์ผ๋ก ๋ฟ๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ, ์๋ฏธ ์๋ ์ ๋ค๋ผ๋ฆฌ ๋ฌถ์ด์ ํต์ ํ์
- ๊ฐ์ ์ ๊ด๋ฆฌ์ ์ฐพ๋ ๋ฐฉ๋ฒ
- ์์ผ ๋ฑ ์์ ์ฌ์ฉ์ ํจ์จํ
- Python์ธ ์ธ์ด๋ฅผ ํตํ ์ค์ ๋ชจ๋ฐ์ผ ์ฑ ๊ฐ๋ฐ
- codon python
- ์๋ก์ด ์ฑ๋ฅ์ด ์ข์ ํ์ด์ฌ compiler
- cpython -> native machine code
- virtual machine ์ด ์๋๋ผ, mac ๋ค์ดํฐ๋ธ๋ก
- ๋จธ์ ๋ฌ๋, ์ฒ์ฒด๋ฌผ๋ฆฌ ๋ฑ๋ฑ ๋ณต์กํ ๊ณ์ฐ์ ํ๋ค๋ฉด ์ถ์ฒ
'ComputerScience > FullStackProgramming' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ์คํ] HTTP request methods / Proxy Cache (0) | 2023.04.18 |
---|---|
[ํ์คํ] HTTP/1.1 intro / URL, TCP/IP (0) | 2023.04.18 |
[ํ์คํ] Zero message queue (ZMQ) (0) | 2023.04.17 |
[ํ์คํ] Application Layer messaging protocol (0) | 2023.04.17 |
[ํ์คํ] TCP ๋น๋๊ธฐ์ socket server programming (1) | 2023.04.16 |