{"id":34867,"date":"2024-08-12T15:47:42","date_gmt":"2024-08-12T08:47:42","guid":{"rendered":"http:\/\/jupitek.maudemo.vip\/index.php\/2024\/08\/12\/how-to-create-a-message-stream-with-rabbitmq\/"},"modified":"2024-08-12T15:47:42","modified_gmt":"2024-08-12T08:47:42","slug":"how-to-create-a-message-stream-with-rabbitmq","status":"publish","type":"post","link":"https:\/\/jupitek.maudemo.vip\/index.php\/2024\/08\/12\/how-to-create-a-message-stream-with-rabbitmq\/","title":{"rendered":"T\u1ea1o Message Stream v\u1edbi RabbitMQ"},"content":{"rendered":"<p>Phi\u00ean b\u1ea3n 3.9 c\u1ee7a&nbsp;<a href=\"https:\/\/www.rabbitmq.com\/\" target=\"_blank\" rel=\"noreferrer noopener\">RabbitMQ<\/a>&nbsp;gi\u1edbi thi\u1ec7u m\u1ed9t c\u1ea5u tr\u00fac d\u1eef li\u1ec7u m\u1edbi g\u1ecdi l\u00e0&nbsp;<em>lu\u1ed3ng<\/em>&nbsp;. Lu\u1ed3ng v\u00e0 h\u00e0ng \u0111\u1ee3i kh\u00e1c nhau v\u1ec1 c\u00e1ch ch\u00fang ho\u1ea1t \u0111\u1ed9ng v\u1edbi d\u1eef li\u1ec7u. Lu\u1ed3ng tin nh\u1eafn d\u1ef1a tr\u00ean \u0111\u0103ng k\u00fd, d\u1ef1a v\u00e0o t\u1ec7p nh\u1eadt k\u00fd \u0111\u01b0\u1ee3c s\u1eafp x\u1ebfp theo ch\u1ee7 \u0111\u1ec1 \u0111\u1ec3 ph\u00e2n ph\u1ed1i. Trong khi \u0111\u00f3, h\u00e0ng \u0111\u1ee3i tin nh\u1eafn l\u00e0 \u0111i\u1ec3m-\u0111\u1ebfn-\u0111i\u1ec3m. Nh\u1eefng kh\u00e1c bi\u1ec7t kh\u00e1c gi\u1eefa lu\u1ed3ng v\u00e0 h\u00e0ng \u0111\u1ee3i \u0111\u01b0\u1ee3c m\u00f4 t\u1ea3 sau, nh\u01b0ng s\u1ef1 kh\u00e1c bi\u1ec7t ch\u00ednh l\u00e0 c\u00e1ch ch\u00fang qu\u1ea3n l\u00fd ph\u00e2n ph\u1ed1i d\u1eef li\u1ec7u. S\u1ef1 kh\u00e1c bi\u1ec7t n\u00e0y x\u00e1c \u0111\u1ecbnh c\u00e1c tr\u01b0\u1eddng h\u1ee3p s\u1eed d\u1ee5ng m\u00e0 m\u1ed7i c\u1ea5u tr\u00fac d\u1eef li\u1ec7u c\u00f3 hi\u1ec7u qu\u1ea3 nh\u1ea5t.<\/p>\n<p>\u0110i\u1ec1u quan tr\u1ecdng n\u1eefa l\u00e0 kh\u00f4ng n\u00ean nh\u1ea7m l\u1eabn RabbitMQ v\u1edbi c\u00e1c s\u1ea3n ph\u1ea9m nh\u01b0&nbsp;<a href=\"https:\/\/kafka.apache.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">Apache Kafka<\/a>&nbsp;, v\u00ec c\u00e1c tr\u01b0\u1eddng h\u1ee3p s\u1eed d\u1ee5ng kh\u00e1c nhau. RabbitMQ cung c\u1ea5p m\u1ed9t tr\u00ecnh m\u00f4i gi\u1edbi tin nh\u1eafn m\u1ee5c \u0111\u00edch chung, trong khi Kafka cung c\u1ea5p m\u1ed9t n\u1ec1n t\u1ea3ng ph\u00e1t tr\u1ef1c tuy\u1ebfn s\u1ef1 ki\u1ec7n.<\/p>\n<h2 id=\"what-is-rabbitmq\">RabbitMQ l\u00e0 g\u00ec?<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#what-is-rabbitmq\"><\/a><\/h2>\n<p>RabbitMQ l\u00e0 m\u1ed9t h\u1ec7 th\u1ed1ng m\u00f4i gi\u1edbi tin nh\u1eafn ph\u00e2n t\u00e1n d\u1ef1a tr\u00ean Giao th\u1ee9c x\u1ebfp h\u00e0ng tin nh\u1eafn n\u00e2ng cao (AMPQ) \u0111\u1ec3 truy\u1ec1n tin nh\u1eafn an to\u00e0n. Nh\u00e0 s\u1ea3n xu\u1ea5t (ho\u1eb7c nh\u00e0 xu\u1ea5t b\u1ea3n) t\u1ea1o tin nh\u1eafn, g\u1eedi tin nh\u1eafn \u0111\u1ebfn nh\u00e0 m\u00f4i gi\u1edbi v\u00e0 ng\u01b0\u1eddi ti\u00eau d\u00f9ng (ho\u1eb7c ng\u01b0\u1eddi \u0111\u0103ng k\u00fd) s\u1ebd nh\u1eadn tin nh\u1eafn. \u0110i\u1ec1u n\u00e0y cho ph\u00e9p giao ti\u1ebfp kh\u00f4ng \u0111\u1ed3ng b\u1ed9, trong \u0111\u00f3 nh\u00e0 s\u1ea3n xu\u1ea5t v\u00e0 ng\u01b0\u1eddi ti\u00eau d\u00f9ng kh\u00f4ng c\u1ea7n ph\u1ea3i c\u00f3 m\u1eb7t c\u00f9ng l\u00fac. Do b\u1ea3n ch\u1ea5t kh\u00f4ng \u0111\u1ed3ng b\u1ed9 c\u1ee7a n\u00f3, thi\u1ebft l\u1eadp k\u1ebft qu\u1ea3 nhanh, c\u00f3 th\u1ec3 m\u1edf r\u1ed9ng v\u00e0 b\u1ec1n v\u1eefng.&nbsp;<a href=\"https:\/\/www.rabbitmq.com\/tutorials\/tutorial-one-python.html\" target=\"_blank\" rel=\"noreferrer noopener\">H\u01b0\u1edbng d\u1eabn &#8220;Hello world!&#8221; c\u1ee7a RabbitMQ<\/a>&nbsp;\u0111i s\u00e2u h\u01a1n v\u00e0o c\u00e1ch th\u1ee9c ho\u1ea1t \u0111\u1ed9ng c\u1ee7a \u0111i\u1ec1u n\u00e0y.<\/p>\n<h3 id=\"message-broker\">M\u00f4i gi\u1edbi tin nh\u1eafn<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#message-broker\"><\/a><\/h3>\n<p>Ph\u1ea7n trung t\u00e2m c\u1ee7a RabbitMQ l\u00e0 message broker, \u0111\u00f3ng vai tr\u00f2 l\u00e0 trung gian cho vi\u1ec7c nh\u1eafn tin. H\u00e3y ngh\u0129 v\u1ec1 message broker nh\u01b0 m\u1ed9t lo\u1ea1i b\u1ea3ng tin. M\u1ed9t producer \u0111\u1eb7t m\u1ed9t tin nh\u1eafn tr\u00ean m\u1ed9t b\u1ea3ng tin c\u1ee5 th\u1ec3 v\u00e0 m\u1ed9t consumer quan t\u00e2m s\u1ebd g\u1ee1 tin nh\u1eafn \u0111\u00f3 xu\u1ed1ng. Message broker h\u1ed7 tr\u1ee3 nhi\u1ec1u lo\u1ea1i h\u00e0ng \u0111\u1ee3i gi\u1eef tin nh\u1eafn cho \u0111\u1ebfn khi consumer nh\u1eadn \u0111\u01b0\u1ee3c ch\u00fang. \u0110\u1ec3 t\u1ea1o tin nh\u1eafn, producer m\u1edf k\u1ebft n\u1ed1i \u0111\u1ebfn m\u1ed9t k\u00eanh c\u1ee5 th\u1ec3, t\u1ea1o m\u1ed9t h\u00e0ng \u0111\u1ee3i t\u1ea1i \u0111\u00f3, r\u1ed3i t\u1ea3i tin nh\u1eafn l\u00ean. T\u01b0\u01a1ng t\u1ef1 nh\u01b0 v\u1eady, consumer m\u1edf k\u1ebft n\u1ed1i \u0111\u1ebfn c\u00f9ng m\u1ed9t k\u00eanh, \u0111\u1ecbnh v\u1ecb h\u00e0ng \u0111\u1ee3i v\u00e0 t\u1ea3i xu\u1ed1ng b\u1ea5t k\u1ef3 tin nh\u1eafn n\u00e0o m\u00e0 n\u00f3 t\u00ecm th\u1ea5y.<\/p>\n<h3 id=\"queue-types\">C\u00e1c lo\u1ea1i h\u00e0ng \u0111\u1ee3i<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#queue-types\"><\/a><\/h3>\n<p>H\u00e0ng \u0111\u1ee3i l\u00e0 m\u1ed9t c\u1ea5u tr\u00fac d\u1eef li\u1ec7u ch\u1ee9a c\u00e1c th\u00f4ng \u0111i\u1ec7p. Khi l\u00e0m vi\u1ec7c v\u1edbi RabbitMQ, t\u1ea5t c\u1ea3 c\u00e1c h\u00e0ng \u0111\u1ee3i \u0111\u1ec1u theo nguy\u00ean t\u1eafc v\u00e0o tr\u01b0\u1edbc, ra tr\u01b0\u1edbc (FIFO). Gi\u1ed1ng nh\u01b0 vi\u1ec7c x\u1ebfp h\u00e0ng, m\u1ed9t th\u00f4ng \u0111i\u1ec7p b\u1eaft \u0111\u1ea7u \u1edf cu\u1ed1i h\u00e0ng \u0111\u1ee3i v\u00e0 ti\u1ebfn d\u1ea7n l\u00ean \u0111\u1ea7u h\u00e0ng \u0111\u1ee3i. C\u00f3 ba lo\u1ea1i h\u00e0ng \u0111\u1ee3i ph\u1ed5 bi\u1ebfn:<\/p>\n<ul>\n<li><strong>Classic<\/strong>&nbsp;: Ki\u1ec3u h\u00e0ng \u0111\u1ee3i ban \u0111\u1ea7u, \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp \u0111\u1ec3 lo\u1ea1i b\u1ecf trong phi\u00ean b\u1ea3n t\u01b0\u01a1ng lai do nh\u1eefng h\u1ea1n ch\u1ebf v\u1ec1 m\u1eb7t k\u1ef9 thu\u1eadt. B\u00e0i vi\u1ebft&nbsp;<a href=\"https:\/\/www.rabbitmq.com\/ha.html\" target=\"_blank\" rel=\"noreferrer noopener\">Classic Queue Mirroring<\/a>&nbsp;c\u00f3 nhi\u1ec1u th\u00f4ng tin h\u01a1n v\u1ec1 ch\u00fang v\u00e0 c\u00e1ch di chuy\u1ec3n \u0111\u1ebfn h\u00e0ng \u0111\u1ee3i quorum.<\/li>\n<li><strong>Quorum<\/strong>&nbsp;: \u0110\u00e2y l\u00e0 m\u1ed9t&nbsp;<a href=\"https:\/\/www.rabbitmq.com\/quorum-queues.html\" target=\"_blank\" rel=\"noreferrer noopener\">d\u1ea1ng h\u00e0ng \u0111\u1ee3i m\u1edbi h\u01a1n<\/a>&nbsp;cung c\u1ea5p l\u1ee3i th\u1ebf v\u1ec1 c\u1ea3 \u0111\u1ed9 tin c\u1eady v\u00e0 t\u1ed1c \u0111\u1ed9 so v\u1edbi h\u00e0ng \u0111\u1ee3i c\u1ed5 \u0111i\u1ec3n. N\u00f3 d\u1ef1a v\u00e0o s\u1ef1 \u0111\u1ed3ng thu\u1eadn gi\u1eefa ph\u1ea7n l\u1edbn c\u00e1c b\u1ea3n sao khi c\u00f3 s\u1ef1 kh\u00e1c bi\u1ec7t gi\u1eefa c\u00e1c b\u1ea3n sao ri\u00eang l\u1ebb, \u0111\u1ea3m b\u1ea3o t\u00ednh an to\u00e0n v\u00e0 t\u00ednh nh\u1ea5t qu\u00e1n c\u1ee7a d\u1eef li\u1ec7u.<\/li>\n<li><strong>Lu\u1ed3ng<\/strong>&nbsp;: Lu\u1ed3ng l\u00e0 m\u1ed9t lo\u1ea1i h\u00e0ng \u0111\u1ee3i t\u0103ng c\u01b0\u1eddng gi\u1ea3i quy\u1ebft c\u00e1c y\u00eau c\u1ea7u l\u1eadp tr\u00ecnh c\u1ee5 th\u1ec3 nh\u01b0 \u0111\u01b0\u1ee3c m\u00f4 t\u1ea3 trong ph\u1ea7n c\u00f2n l\u1ea1i c\u1ee7a h\u01b0\u1edbng d\u1eabn n\u00e0y. V\u1ec1 c\u01a1 b\u1ea3n, \u0111\u00e2y l\u00e0 m\u1ed9t h\u00e0ng \u0111\u1ee3i kh\u00f4ng ph\u00e1 h\u1ee7y, trong \u0111\u00f3 c\u00e1c th\u00f4ng b\u00e1o kh\u00f4ng b\u1ecb x\u00f3a ngay sau khi \u0111\u1ecdc.<\/li>\n<\/ul>\n<p>H\u00e0ng \u0111\u1ee3i c\u00f3 th\u1ec3 b\u1ec1n v\u1eefng ho\u1eb7c t\u1ea1m th\u1eddi. D\u1eef li\u1ec7u cho h\u00e0ng \u0111\u1ee3i b\u1ec1n v\u1eefng \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef tr\u00ean \u0111\u0129a \u0111\u1ec3 n\u00f3 c\u00f3 th\u1ec3 t\u1ed3n t\u1ea1i sau khi kh\u1edfi \u0111\u1ed9ng l\u1ea1i. Ngo\u00e0i ra, d\u1eef li\u1ec7u cho h\u00e0ng \u0111\u1ee3i t\u1ea1m th\u1eddi \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef trong b\u1ed9 nh\u1edb b\u1ea5t c\u1ee9 khi n\u00e0o c\u00f3 th\u1ec3. H\u00e0ng \u0111\u1ee3i b\u1ec1n v\u1eefng l\u00e0 l\u1ef1a ch\u1ecdn t\u1ed1i \u01b0u cho b\u1ea5t k\u1ef3 nhu c\u1ea7u n\u00e0o \u0111\u00f2i h\u1ecfi lu\u1ed3ng th\u00f4ng \u0111i\u1ec7p c\u00f3 \u0111\u1ed9 tin c\u1eady cao. Trong khi \u0111\u00f3, h\u00e0ng \u0111\u1ee3i t\u1ea1m th\u1eddi ho\u1ea1t \u0111\u1ed9ng t\u1ed1t h\u01a1n \u0111\u1ed1i v\u1edbi d\u1eef li\u1ec7u nh\u1ea1y c\u1ea3m v\u1edbi th\u1eddi gian, trong \u0111\u00f3 t\u1ed1c \u0111\u1ed9 \u0111\u01b0\u1ee3c coi tr\u1ecdng h\u01a1n t\u00ednh b\u1ec1n b\u1ec9.<\/p>\n<p>\u0110\u1eb7c \u0111i\u1ec3m h\u00e0ng \u0111\u1ee3i c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c s\u1eeda \u0111\u1ed5i t\u00f9y thu\u1ed9c v\u00e0o lo\u1ea1i h\u00e0ng \u0111\u1ee3i. V\u00ed d\u1ee5, b\u1ea1n c\u00f3 th\u1ec3 \u0111\u1eb7t gi\u00e1 tr\u1ecb th\u1eddi gian t\u1ed3n t\u1ea1i (TTL) cho c\u00e1c tin nh\u1eafn trong h\u00e0ng \u0111\u1ee3i \u0111\u1ec3 d\u1eef li\u1ec7u kh\u00f4ng \u0111\u01b0\u1ee3c x\u1eed l\u00fd khi kh\u00f4ng c\u00f2n li\u00ean quan n\u1eefa. C\u00e1c \u0111\u1eb7c \u0111i\u1ec3m n\u00e0y c\u0169ng ki\u1ec3m so\u00e1t c\u00e1c v\u1ea5n \u0111\u1ec1 nh\u01b0 \u0111\u1ed9 d\u00e0i tin nh\u1eafn t\u1ed1i \u0111a v\u00e0 m\u1ee9c \u0111\u1ed9 \u01b0u ti\u00ean t\u1ed1i \u0111a m\u00e0 m\u1ed9t tin nh\u1eafn c\u00f3 th\u1ec3 c\u00f3.<\/p>\n<h2 id=\"advantages-and-disadvantages-of-message-streams-vs-other-queue-types\">\u01afu \u0111i\u1ec3m v\u00e0 nh\u01b0\u1ee3c \u0111i\u1ec3m c\u1ee7a lu\u1ed3ng tin nh\u1eafn so v\u1edbi c\u00e1c lo\u1ea1i h\u00e0ng \u0111\u1ee3i kh\u00e1c<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#advantages-and-disadvantages-of-message-streams-vs-other-queue-types\"><\/a><\/h2>\n<p>Lu\u1ed3ng tin nh\u1eafn c\u00f3 \u01b0u \u0111i\u1ec3m v\u00e0 nh\u01b0\u1ee3c \u0111i\u1ec3m khi so s\u00e1nh v\u1edbi h\u00e0ng \u0111\u1ee3i. Hi\u1ec3u lo\u1ea1i \u1ee9ng d\u1ee5ng \u0111ang \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng l\u00e0 ch\u00eca kh\u00f3a. M\u1ed9t s\u1ed1 \u1ee9ng d\u1ee5ng \u0111\u01b0\u1ee3c h\u01b0\u1edfng l\u1ee3i r\u1ea5t nhi\u1ec1u t\u1eeb lu\u1ed3ng tin nh\u1eafn, trong khi nh\u1eefng \u1ee9ng d\u1ee5ng kh\u00e1c th\u00ec kh\u00f4ng.<\/p>\n<h3 id=\"advantages\">Thu\u1eadn l\u1ee3i<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#advantages\"><\/a><\/h3>\n<p>\u01afu \u0111i\u1ec3m c\u1ee7a vi\u1ec7c s\u1eed d\u1ee5ng lu\u1ed3ng v\u01b0\u1ee3t xa nh\u01b0\u1ee3c \u0111i\u1ec3m \u0111\u1ed1i v\u1edbi c\u00e1c tr\u01b0\u1eddng h\u1ee3p s\u1eed d\u1ee5ng lu\u1ed3ng th\u01b0\u1eddng \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng. V\u00ed d\u1ee5, trong m\u00f4i tr\u01b0\u1eddng nh\u00e0 xu\u1ea5t b\u1ea3n\/ng\u01b0\u1eddi \u0111\u0103ng k\u00fd, vi\u1ec7c c\u1ed1 g\u1eafng vi\u1ebft m\u00e3 b\u1eb1ng h\u00e0ng \u0111\u1ee3i c\u1ed5 \u0111i\u1ec3n ho\u1eb7c h\u00e0ng \u0111\u1ee3i s\u1ed1 \u0111\u00f4ng c\u00f3 th\u1ec3 kh\u00f3 kh\u0103n. Tuy nhi\u00ean, t\u1ea5t c\u1ea3 c\u00e1c h\u1ed7 tr\u1ee3 c\u1ea7n thi\u1ebft \u0111\u1ec1u \u0111\u01b0\u1ee3c t\u00edch h\u1ee3p v\u00e0o lu\u1ed3ng.<\/p>\n<h4 id=\"streams-are-non-destructive\">C\u00e1c lu\u1ed3ng kh\u00f4ng ph\u00e1 h\u1ee7y<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#streams-are-non-destructive\"><\/a><\/h4>\n<p>S\u1ef1 kh\u00e1c bi\u1ec7t quan tr\u1ecdng nh\u1ea5t gi\u1eefa lu\u1ed3ng v\u00e0 h\u00e0ng \u0111\u1ee3i l\u00e0 lu\u1ed3ng kh\u00f4ng ph\u00e1 h\u1ee7y. Nhi\u1ec1u ng\u01b0\u1eddi d\u00f9ng c\u00f3 th\u1ec3 \u0111\u1ecdc c\u00f9ng m\u1ed9t th\u00f4ng \u0111i\u1ec7p, khi\u1ebfn lu\u1ed3ng gi\u1ed1ng m\u1ed9t t\u1edd b\u00e1o h\u01a1n l\u00e0 m\u1ed9t b\u1ea3ng th\u00f4ng b\u00e1o.<\/p>\n<h4 id=\"streams-do-not-need-multiple-bindings-to-serve-multiple-clients\">C\u00e1c lu\u1ed3ng kh\u00f4ng c\u1ea7n nhi\u1ec1u r\u00e0ng bu\u1ed9c \u0111\u1ec3 ph\u1ee5c v\u1ee5 nhi\u1ec1u m\u00e1y kh\u00e1ch<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#streams-do-not-need-multiple-bindings-to-serve-multiple-clients\"><\/a><\/h4>\n<p>H\u00e0ng \u0111\u1ee3i y\u00eau c\u1ea7u nhi\u1ec1u r\u00e0ng bu\u1ed9c n\u1ebfu b\u1ea1n mu\u1ed1n g\u1eedi c\u00f9ng m\u1ed9t th\u00f4ng \u0111i\u1ec7p \u0111\u1ebfn nhi\u1ec1u ng\u01b0\u1eddi d\u00f9ng. L\u00fd do l\u00e0 khi ng\u01b0\u1eddi d\u00f9ng \u0111\u1ecdc m\u1ed9t th\u00f4ng \u0111i\u1ec7p, th\u00f4ng \u0111i\u1ec7p \u0111\u00f3 s\u1ebd bi\u1ebfn m\u1ea5t kh\u1ecfi h\u00e0ng \u0111\u1ee3i. Do \u0111\u00f3, m\u1ed7i ng\u01b0\u1eddi d\u00f9ng y\u00eau c\u1ea7u m\u1ed9t r\u00e0ng bu\u1ed9c ri\u00eang bi\u1ec7t \u0111\u1ec3 \u0111\u1ea3m b\u1ea3o nh\u1eadn \u0111\u01b0\u1ee3c b\u1ea3n sao th\u00f4ng \u0111i\u1ec7p c\u1ee7a m\u00ecnh. Ng\u01b0\u1ee3c l\u1ea1i, c\u00e1c th\u00f4ng \u0111i\u1ec7p trong m\u1ed9t lu\u1ed3ng kh\u00f4ng b\u1ecb x\u00f3a, cho ph\u00e9p nhi\u1ec1u ng\u01b0\u1eddi d\u00f9ng truy c\u1eadp th\u00f4ng \u0111i\u1ec7p th\u00f4ng qua m\u1ed9t r\u00e0ng bu\u1ed9c duy nh\u1ea5t. C\u00e1ch ti\u1ebfp c\u1eadn n\u00e0y ti\u1ebft ki\u1ec7m b\u1ed9 nh\u1edb v\u00e0 c\u00e1c t\u00e0i nguy\u00ean kh\u00e1c, \u0111\u1ed3ng th\u1eddi l\u00e0m cho lu\u1ed3ng nhanh h\u01a1n v\u00ec m\u00e3 t\u1ed1n \u00edt th\u1eddi gian h\u01a1n \u0111\u1ec3 sao ch\u00e9p th\u00f4ng \u0111i\u1ec7p.<\/p>\n<h4 id=\"streams-can-be-accessed-at-any-place-in-the-timeline-of-messages\">C\u00f3 th\u1ec3 truy c\u1eadp c\u00e1c lu\u1ed3ng \u1edf b\u1ea5t k\u1ef3 v\u1ecb tr\u00ed n\u00e0o trong d\u00f2ng th\u1eddi gian c\u1ee7a tin nh\u1eafn<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#streams-can-be-accessed-at-any-place-in-the-timeline-of-messages\"><\/a><\/h4>\n<p>\u0110\u1ec3 l\u00e0m cho lu\u1ed3ng h\u1eefu \u00edch nh\u1ea5t c\u00f3 th\u1ec3, ng\u01b0\u1eddi d\u00f9ng c\u00f3 th\u1ec3 ch\u1ec9 \u0111\u1ecbnh tin nh\u1eafn n\u00e0o c\u1ea7n \u0111\u1ecdc b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng \u0111\u1ed9 l\u1ec7ch tuy\u1ec7t \u0111\u1ed1i ho\u1eb7c d\u1ea5u th\u1eddi gian. Ngo\u00e0i ra, ng\u01b0\u1eddi d\u00f9ng c\u00f3 th\u1ec3 \u0111\u1ecdc c\u00f9ng m\u1ed9t tin nh\u1eafn nhi\u1ec1u l\u1ea7n t\u00f9y theo nhu c\u1ea7u b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng c\u00f9ng m\u1ed9t ph\u01b0\u01a1ng ph\u00e1p. Kh\u1ea3 n\u0103ng truy c\u1eadp c\u00e1c tin nh\u1eafn c\u1ee5 th\u1ec3 \u1edf b\u1ea5t k\u1ef3 \u0111\u00e2u trong lu\u1ed3ng n\u00e0y gi\u00fap gi\u1ea3m nhu c\u1ea7u l\u01b0u tr\u1eef c\u1ee7a ng\u01b0\u1eddi d\u00f9ng v\u00ec ng\u01b0\u1eddi d\u00f9ng kh\u00f4ng c\u1ea7n l\u01b0u tr\u1eef b\u1ea3n sao c\u1ee7a m\u1ecdi tin nh\u1eafn.<\/p>\n<h4 id=\"streams-are-faster-than-queues\">Lu\u1ed3ng nhanh h\u01a1n h\u00e0ng \u0111\u1ee3i<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#streams-are-faster-than-queues\"><\/a><\/h4>\n<p>Stream s\u1eed d\u1ee5ng t\u00e0i nguy\u00ean hi\u1ec7u qu\u1ea3 h\u01a1n h\u00e0ng \u0111\u1ee3i v\u00ec b\u1ea1n kh\u00f4ng c\u1ea7n ph\u1ea3i sao ch\u00e9p tin nh\u1eafn. Ngo\u00e0i ra, stream kh\u00f4ng y\u00eau c\u1ea7u nhi\u1ec1u r\u00e0ng bu\u1ed9c \u0111\u1ec3 ho\u00e0n th\u00e0nh c\u00f4ng vi\u1ec7c. Sau khi tin nh\u1eafn \u0111\u01b0\u1ee3c ghi v\u00e0o \u0111\u0129a, n\u00f3 kh\u00f4ng ti\u00eau t\u1ed1n b\u1ea5t k\u1ef3 b\u1ed9 nh\u1edb m\u00e1y ch\u1ee7 n\u00e0o, gi\u1ea3i ph\u00f3ng nhi\u1ec1u b\u1ed9 nh\u1edb t\u1ed1c \u0111\u1ed9 cao h\u01a1n cho c\u00e1c t\u00e1c v\u1ee5 kh\u00e1c. Nh\u1edd nh\u1eefng t\u1ed1i \u01b0u h\u00f3a n\u00e0y v\u00e0 c\u00e1c t\u1ed1i \u01b0u h\u00f3a kh\u00e1c, stream c\u1ef1c k\u1ef3 nhanh khi so s\u00e1nh v\u1edbi h\u00e0ng \u0111\u1ee3i. Th\u00eam v\u00e0o kh\u1ea3 n\u0103ng thu g\u1ecdn m\u00e3 \u1ee9ng d\u1ee5ng, hi\u1ec7u qu\u1ea3 c\u1ee7a stream tr\u1edf n\u00ean r\u00f5 r\u00e0ng h\u01a1n n\u1eefa.<\/p>\n<h3 id=\"disadvantages\">Nh\u01b0\u1ee3c \u0111i\u1ec3m<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#disadvantages\"><\/a><\/h3>\n<p>Kh\u00f4ng c\u00f3 gi\u1ea3i ph\u00e1p l\u1eadp tr\u00ecnh ho\u00e0n h\u1ea3o n\u00e0o, ch\u1ec9 c\u00f3 gi\u1ea3i ph\u00e1p ho\u1ea1t \u0111\u1ed9ng t\u1ed1t nh\u1ea5t trong c\u00e1c tr\u01b0\u1eddng h\u1ee3p s\u1eed d\u1ee5ng c\u1ee5 th\u1ec3. M\u1eb7c d\u00f9 c\u00e1c lu\u1ed3ng RabbitMQ cung c\u1ea5p nhi\u1ec1u ch\u1ee9c n\u0103ng, nh\u01b0ng ch\u00fang c\u0169ng c\u00f3 nh\u1eefng nh\u01b0\u1ee3c \u0111i\u1ec3m khi\u1ebfn ch\u00fang k\u00e9m hi\u1ec7u qu\u1ea3 h\u01a1n \u0111\u1ed1i v\u1edbi m\u1ed9t s\u1ed1 tr\u01b0\u1eddng h\u1ee3p s\u1eed d\u1ee5ng.<\/p>\n<h4 id=\"can-be-quite-large\">C\u00f3 th\u1ec3 kh\u00e1 l\u1edbn<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#can-be-quite-large\"><\/a><\/h4>\n<p>C\u00e1c lu\u1ed3ng c\u00f3 th\u1ec3 ti\u1ebfp t\u1ee5c ph\u00e1t tri\u1ec3n v\u00f4 th\u1eddi h\u1ea1n, \u0111i\u1ec1u \u0111\u00f3 c\u00f3 ngh\u0129a l\u00e0 vi\u1ec7c c\u1ea5u h\u00ecnh \u0111\u00fang m\u1ed9t lu\u1ed3ng l\u00e0 \u0111i\u1ec1u c\u1ea7n thi\u1ebft. RabbitMQ kh\u00f4ng bao gi\u1edd x\u00f3a b\u1ea5t k\u1ef3 th\u00f4ng b\u00e1o n\u00e0o kh\u1ecfi lu\u1ed3ng tr\u1eeb khi b\u1ea1n cung c\u1ea5p c\u00e1c r\u00e0ng bu\u1ed9c lu\u1ed3ng. B\u1ea1n c\u00f3 th\u1ec3&nbsp;<a href=\"https:\/\/www.rabbitmq.com\/streams.html#declaring\" target=\"_blank\" rel=\"noreferrer noopener\">ki\u1ec3m so\u00e1t k\u00edch th\u01b0\u1edbc c\u1ee7a lu\u1ed3ng<\/a>&nbsp;theo hai c\u00e1ch. C\u00e1ch \u0111\u1ea7u ti\u00ean l\u00e0 s\u1eed d\u1ee5ng c\u00e1c thi\u1ebft l\u1eadp&nbsp;<code>x-max-length-bytes<\/code>v\u00e0\/ho\u1eb7c&nbsp;<code>x-stream-max-segment-size-bytes<\/code>. \u1ede \u0111\u00e2y, c\u00e1c th\u00f4ng b\u00e1o c\u0169 h\u01a1n s\u1ebd b\u1ecb x\u00f3a b\u1ea5t c\u1ee9 khi n\u00e0o vi\u1ec7c th\u00eam m\u1ed9t th\u00f4ng b\u00e1o m\u1edbi v\u01b0\u1ee3t qu\u00e1 c\u00e1c tham s\u1ed1 thi\u1ebft l\u1eadp. Ph\u01b0\u01a1ng ph\u00e1p th\u1ee9 hai l\u00e0 s\u1eed d\u1ee5ng thi\u1ebft&nbsp;<code>x-max-age<\/code>l\u1eadp \u0111\u1ec3 ki\u1ec3m so\u00e1t th\u1eddi gian lu\u1ed3ng l\u01b0u gi\u1eef c\u00e1c th\u00f4ng b\u00e1o c\u1ee7a n\u00f3. \u1ede \u0111\u00e2y, khi th\u00f4ng b\u00e1o h\u1ebft th\u1eddi gian, n\u00f3 ph\u1ea3i \u0111\u01b0\u1ee3c t\u1ea1o l\u1ea1i.<\/p>\n<h4 id=\"does-not-guarantee-deliverability\">Kh\u00f4ng \u0111\u1ea3m b\u1ea3o kh\u1ea3 n\u0103ng ph\u00e2n ph\u1ed1i<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#does-not-guarantee-deliverability\"><\/a><\/h4>\n<p>\u0110i\u1ec1u c\u1ea7n thi\u1ebft l\u00e0 ph\u1ea3i bi\u1ebft &#8220;b\u1ea3o \u0111\u1ea3m ph\u00e2n ph\u1ed1i \u00edt nh\u1ea5t m\u1ed9t l\u1ea7n&#8221; c\u00f3 ngh\u0129a l\u00e0 g\u00ec. C\u00e1c lu\u1ed3ng \u0111\u1ea3m b\u1ea3o r\u1eb1ng m\u1ed9t s\u1ed1 ng\u01b0\u1eddi d\u00f9ng nh\u00ecn th\u1ea5y tin nh\u1eafn \u00edt nh\u1ea5t m\u1ed9t l\u1ea7n b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng s\u1ef1 k\u1ebft h\u1ee3p gi\u1eefa x\u00e1c nh\u1eadn c\u1ee7a nh\u00e0 xu\u1ea5t b\u1ea3n v\u00e0 lo\u1ea1i b\u1ecf tr\u00f9ng l\u1eb7p tin nh\u1eafn \u1edf ph\u00eda nh\u00e0 xu\u1ea5t b\u1ea3n. Tuy nhi\u00ean, n\u00f3 kh\u00f4ng \u0111\u1ea3m b\u1ea3o r\u1eb1ng m\u1ed9t ng\u01b0\u1eddi d\u00f9ng c\u1ee5 th\u1ec3 nh\u00ecn th\u1ea5y tin nh\u1eafn. \u0110i\u1ec1u n\u00e0y c\u00f3 ngh\u0129a l\u00e0 m\u00e3 ng\u01b0\u1eddi d\u00f9ng ph\u1ea3i \u0111\u01b0\u1ee3c vi\u1ebft sao cho ng\u01b0\u1eddi d\u00f9ng ki\u1ec3m tra&nbsp;<em>m\u1ecdi<\/em>&nbsp;tin nh\u1eafn. M\u1ed9t tin nh\u1eafn c\u0169ng c\u00f3 th\u1ec3 b\u1ecb m\u1ea5t gi\u1eefa ch\u1eebng \u0111\u1ed1i v\u1edbi ng\u01b0\u1eddi d\u00f9ng tr\u1eeb khi \u1ee9ng d\u1ee5ng d\u1ef1a v\u00e0o c\u01a1 ch\u1ebf x\u00e1c nh\u1eadn c\u1ee7a nh\u00e0 xu\u1ea5t b\u1ea3n.<\/p>\n<p>C\u00e1c lu\u1ed3ng \u0111\u1ea1t \u0111\u01b0\u1ee3c \u0111\u1eb7c \u0111i\u1ec3m nhanh ch\u00f3ng c\u1ee7a ch\u00fang b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng m\u1ed9t s\u1ed1 ph\u00edm t\u1eaft. V\u00ed d\u1ee5, c\u00e1c lu\u1ed3ng kh\u00f4ng x\u00f3a b\u1ed9 nh\u1edb \u0111\u1ec7m c\u1ee7a h\u1ec7 \u0111i\u1ec1u h\u00e0nh m\u1ed9t c\u00e1ch r\u00f5 r\u00e0ng, \u0111i\u1ec1u \u0111\u00f3 c\u00f3 ngh\u0129a l\u00e0 vi\u1ec7c t\u1eaft m\u00e1y ch\u1ee7 kh\u00f4ng \u0111\u01b0\u1ee3c ki\u1ec3m so\u00e1t c\u00f3 th\u1ec3 d\u1eabn \u0111\u1ebfn m\u1ea5t d\u1eef li\u1ec7u.<\/p>\n<h2 id=\"before-you-begin\">Tr\u01b0\u1edbc khi b\u1ea1n b\u1eaft \u0111\u1ea7u<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#before-you-begin\"><\/a><\/h2>\n<p>C\u00e1c v\u00ed d\u1ee5 trong h\u01b0\u1edbng d\u1eabn n\u00e0y gi\u1ea3 \u0111\u1ecbnh r\u1eb1ng b\u1ea1n c\u00f3 c\u00e0i \u0111\u1eb7t RabbitMQ. L\u00e0m theo h\u01b0\u1edbng d\u1eabn v\u00e0 li\u00ean k\u1ebft b\u00ean d\u01b0\u1edbi \u0111\u1ec3 thi\u1ebft l\u1eadp phi\u00ean b\u1ea3n RabbitMQ:<\/p>\n<ol>\n<li>N\u1ebfu b\u1ea1n ch\u01b0a th\u1ef1c hi\u1ec7n, h\u00e3y t\u1ea1o m\u1ed9t t\u00e0i kho\u1ea3n Linode v\u00e0 Compute Instance. Xem h\u01b0\u1edbng d\u1eabn&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/products\/platform\/get-started\/\">B\u1eaft \u0111\u1ea7u tr\u00ean N\u1ec1n t\u1ea3ng Linode<\/a>&nbsp;v\u00e0&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/products\/compute\/compute-instances\/guides\/create\/\">T\u1ea1o Compute Instance<\/a>&nbsp;c\u1ee7a ch\u00fang t\u00f4i. Ubuntu 22.04 LTS, Nanode 1 GB, phi\u00ean b\u1ea3n CPU d\u00f9ng chung l\u00e0 \u0111\u1ee7 cho c\u00e1c v\u00ed d\u1ee5 trong h\u01b0\u1edbng d\u1eabn n\u00e0y.<\/li>\n<li>L\u00e0m theo h\u01b0\u1edbng d\u1eabn&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/products\/compute\/compute-instances\/guides\/set-up-and-secure\/\">Thi\u1ebft l\u1eadp v\u00e0 B\u1ea3o m\u1eadt Phi\u00ean b\u1ea3n Compute<\/a>&nbsp;c\u1ee7a ch\u00fang t\u00f4i \u0111\u1ec3 c\u1eadp nh\u1eadt h\u1ec7 th\u1ed1ng c\u1ee7a b\u1ea1n. B\u1ea1n c\u0169ng c\u00f3 th\u1ec3 mu\u1ed1n \u0111\u1eb7t m\u00fai gi\u1edd, c\u1ea5u h\u00ecnh t\u00ean m\u00e1y ch\u1ee7, t\u1ea1o t\u00e0i kho\u1ea3n ng\u01b0\u1eddi d\u00f9ng gi\u1edbi h\u1ea1n v\u00e0 t\u0103ng c\u01b0\u1eddng quy\u1ec1n truy c\u1eadp SSH.<\/li>\n<li>Th\u1ef1c hi\u1ec7n theo h\u01b0\u1edbng d\u1eabn c\u00f3 trong ph\u1ea7n CloudSmith c\u1ee7a h\u01b0\u1edbng d\u1eabn ch\u00ednh th\u1ee9c c\u1ee7a RabbitMQ v\u1ec1&nbsp;<a href=\"https:\/\/www.rabbitmq.com\/install-debian.html#apt-quick-start-cloudsmith\" target=\"_blank\" rel=\"noreferrer noopener\">C\u00e0i \u0111\u1eb7t tr\u00ean Debian v\u00e0 Ubuntu<\/a>&nbsp;. N\u00f3 cung c\u1ea5p m\u1ecdi th\u1ee9 c\u1ea7n thi\u1ebft cho m\u1ed9t c\u00e0i \u0111\u1eb7t c\u01a1 b\u1ea3n v\u00e0 l\u00e0 thi\u1ebft l\u1eadp \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng cho h\u01b0\u1edbng d\u1eabn n\u00e0y. \u0110\u1ec3 s\u1eed d\u1ee5ng t\u00ednh n\u0103ng lu\u1ed3ng \u0111\u01b0\u1ee3c \u0111\u1ec1 c\u1eadp trong h\u01b0\u1edbng d\u1eabn n\u00e0y, h\u00e3y \u0111\u1ea3m b\u1ea3o r\u1eb1ng b\u1ea1n \u0111\u00e3 c\u00e0i \u0111\u1eb7t RabbitMQ 3.9 tr\u1edf l\u00ean tr\u00ean m\u00e1y ch\u1ee7 c\u1ee7a m\u00ecnh:<code>sudo rabbitmqctl version<\/code><\/li>\n<li>Ngo\u00e0i ra, h\u00e3y \u0111\u1ea3m b\u1ea3o&nbsp;<a href=\"https:\/\/www.rabbitmq.com\/plugins.html\" target=\"_blank\" rel=\"noreferrer noopener\">b\u1eadt<\/a>&nbsp;c\u00e1c plugin&nbsp;<code>rabbitmq_management<\/code>,&nbsp;<code>rabbitmq_management_agent<\/code>, v\u00e0&nbsp;<code>rabbitmq_web_dispatch<\/code>:<code>sudo rabbitmq-plugins enable rabbitmq_management<\/code><\/li>\n<li>S\u1eed d\u1ee5ng l\u1ec7nh sau \u0111\u1ec3 c\u00e0i \u0111\u1eb7t&nbsp;<code>pip<\/code>n\u1ebfu n\u00f3 ch\u01b0a \u0111\u01b0\u1ee3c c\u00e0i \u0111\u1eb7t tr\u00ean h\u1ec7 th\u1ed1ng c\u1ee7a b\u1ea1n:<code>sudo apt install python3-pip<\/code><\/li>\n<li>S\u1eed d\u1ee5ng&nbsp;<code>pip<\/code>\u0111\u1ec3 c\u00e0i \u0111\u1eb7t Pika h\u1ed7 tr\u1ee3 Python:<code>python3 -m pip install pika --upgrade<\/code><\/li>\n<\/ol>\n<p>Ghi ch\u00faC\u00e1c b\u01b0\u1edbc trong h\u01b0\u1edbng d\u1eabn n\u00e0y y\u00eau c\u1ea7u quy\u1ec1n root. H\u00e3y \u0111\u1ea3m b\u1ea3o ch\u1ea1y c\u00e1c b\u01b0\u1edbc b\u00ean d\u01b0\u1edbi d\u01b0\u1edbi d\u1ea1ng&nbsp;<\/p>\n<p><code>root<\/code>ho\u1eb7c v\u1edbi&nbsp;<\/p>\n<p><code>sudo<\/code>ti\u1ec1n t\u1ed1. \u0110\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin v\u1ec1 quy\u1ec1n, h\u00e3y xem h\u01b0\u1edbng d\u1eabn&nbsp;<\/p>\n<p><a href=\"https:\/\/www.linode.com\/docs\/guides\/linux-users-and-groups\/\">Ng\u01b0\u1eddi d\u00f9ng v\u00e0 Nh\u00f3m Linux<\/a>&nbsp;c\u1ee7a ch\u00fang t\u00f4i .<\/p>\n<h2 id=\"how-to-create-a-message-stream-with-rabbitmq\">C\u00e1ch t\u1ea1o lu\u1ed3ng tin nh\u1eafn v\u1edbi RabbitMQ<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#how-to-create-a-message-stream-with-rabbitmq\"><\/a><\/h2>\n<p>C\u00f3 m\u1ed9t s\u1ed1 t\u00f9y ch\u1ecdn \u0111\u1ec3 t\u1ea1o lu\u1ed3ng trong RabbitMQ, trong \u0111\u00f3 ph\u01b0\u01a1ng ph\u00e1p l\u1eadp tr\u00ecnh v\u00e0 plugin l\u00e0 ph\u1ed5 bi\u1ebfn nh\u1ea5t.<\/p>\n<h3 id=\"should-streams-be-managed-via-rabbitmq-core-or-the-plugin\">Lu\u1ed3ng n\u00ean \u0111\u01b0\u1ee3c qu\u1ea3n l\u00fd th\u00f4ng qua RabbitMQ Core hay Plugin?<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#should-streams-be-managed-via-rabbitmq-core-or-the-plugin\"><\/a><\/h3>\n<p>Hai ph\u01b0\u01a1ng ph\u00e1p c\u01a1 b\u1ea3n \u0111\u1ec3 qu\u1ea3n l\u00fd lu\u1ed3ng RabbitMQ l\u00e0 s\u1eed d\u1ee5ng&nbsp;<a href=\"https:\/\/www.rabbitmq.com\/streams.html\" target=\"_blank\" rel=\"noreferrer noopener\">l\u00f5i lu\u1ed3ng<\/a>&nbsp;ho\u1eb7c&nbsp;<a href=\"https:\/\/www.rabbitmq.com\/stream.html\" target=\"_blank\" rel=\"noreferrer noopener\">plug-in lu\u1ed3ng<\/a>&nbsp;. B\u1ea1n s\u1eed d\u1ee5ng ph\u01b0\u01a1ng ph\u00e1p n\u00e0o t\u00f9y thu\u1ed9c v\u00e0o c\u00e1ch b\u1ea1n \u0111\u1ecbnh l\u00e0m vi\u1ec7c v\u1edbi lu\u1ed3ng. N\u1ebfu b\u1ea1n \u0111\u1ecbnh l\u00e0m vi\u1ec7c ch\u1ee7 y\u1ebfu t\u1ea1i m\u00e1y ch\u1ee7 b\u1eb1ng m\u00e3 \u1ee9ng d\u1ee5ng, th\u00ec l\u00f5i lu\u1ed3ng c\u00f3 th\u1ec3 ho\u1ea1t \u0111\u1ed9ng t\u1ed1t nh\u1ea5t. M\u1eb7t kh\u00e1c, n\u1ebfu b\u1ea1n \u0111\u1ecbnh l\u00e0m vi\u1ec7c nhi\u1ec1u v\u1edbi m\u00e1y kh\u00e1ch, th\u00ec s\u1eed d\u1ee5ng plug-in lu\u1ed3ng c\u00f3 l\u1ebd l\u00e0 l\u1ef1a ch\u1ecdn t\u1ed1t nh\u1ea5t. Ngo\u00e0i ra, plug-in lu\u1ed3ng cung c\u1ea5p quy\u1ec1n truy c\u1eadp GUI th\u00f4ng qua b\u1ea3ng \u0111i\u1ec1u khi\u1ec3n qu\u1ea3n l\u00fd. Xem ph\u1ea7n so s\u00e1nh&nbsp;<a href=\"https:\/\/www.rabbitmq.com\/stream-core-plugin-comparison.html\" target=\"_blank\" rel=\"noreferrer noopener\">Stream Core v\u1edbi Stream Plugin<\/a>&nbsp;\u0111\u1ec3 bi\u1ebft th\u00eam chi ti\u1ebft.<\/p>\n<h3 id=\"what-amount-of-storage-should-be-reserved-for-a-rabbitmq-stream\">C\u1ea7n d\u00e0nh bao nhi\u00eau dung l\u01b0\u1ee3ng l\u01b0u tr\u1eef cho lu\u1ed3ng RabbitMQ?<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#what-amount-of-storage-should-be-reserved-for-a-rabbitmq-stream\"><\/a><\/h3>\n<p>Ph\u1ea7n&nbsp;<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#can-be-quite-large\">C\u00f3 th\u1ec3 kh\u00e1 l\u1edbn<\/a>&nbsp;th\u1ea3o lu\u1eadn v\u1ec1 c\u00e1c tham s\u1ed1 c\u1ea5u h\u00ecnh \u0111\u1ec3 ki\u1ec3m so\u00e1t kh\u00f4ng gian l\u01b0u tr\u1eef v\u00e0 t\u00ednh li\u00ean t\u1ee5c c\u1ee7a tin nh\u1eafn trong lu\u1ed3ng. B\u1ea1n ph\u1ea3i ph\u00e2n b\u1ed5 \u0111\u1ee7 kh\u00f4ng gian l\u01b0u tr\u1eef cho tin nh\u1eafn m\u00e0 b\u1ea1n \u0111\u1ecbnh l\u01b0u tr\u1eef. H\u00e3y nh\u1edb r\u1eb1ng tin nh\u1eafn c\u0169 v\u1eabn c\u00f2n cho \u0111\u1ebfn khi h\u1ebft h\u1ea1n ho\u1eb7c \u0111\u01b0\u1ee3c thay th\u1ebf b\u1eb1ng tin nh\u1eafn m\u1edbi h\u01a1n trong h\u00e0ng \u0111\u1ee3i. \u0110\u1ea3m b\u1ea3o b\u1ea1n thi\u1ebft l\u1eadp&nbsp;<a href=\"https:\/\/www.rabbitmq.com\/disk-alarms.html\" target=\"_blank\" rel=\"noreferrer noopener\">c\u1ea3nh b\u00e1o kh\u00f4ng gian tr\u1ed1ng<\/a>&nbsp;khi c\u1ea5u h\u00ecnh RabbitMQ. \u0110i\u1ec1u n\u00e0y cho ph\u00e9p b\u1ea1n gi\u1ea3i quy\u1ebft c\u00e1c v\u1ea5n \u0111\u1ec1 v\u1ec1 tin nh\u1eafn m\u1ed9t c\u00e1ch ch\u1ee7 \u0111\u1ed9ng, thay v\u00ec ch\u1edd \u1ee9ng d\u1ee5ng b\u1ecb s\u1eadp.<\/p>\n<h3 id=\"example\">V\u00ed d\u1ee5<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#example\"><\/a><\/h3>\n<p>M\u1ed9t c\u00e1ch d\u1ec5 d\u00e0ng \u0111\u1ec3 hi\u1ec3u c\u00e1ch ho\u1ea1t \u0111\u1ed9ng c\u1ee7a lu\u1ed3ng l\u00e0 t\u1ea1o m\u1ed9t \u1ee9ng d\u1ee5ng \u0111\u01a1n gi\u1ea3n bao g\u1ed3m m\u1ed9t nh\u00e0 s\u1ea3n xu\u1ea5t v\u00e0 m\u1ed9t ng\u01b0\u1eddi ti\u00eau d\u00f9ng.<\/p>\n<p>1.\u0110\u1ea7u ti\u00ean, t\u1ea1o m\u1ed9t t\u1ec7p python \u0111\u1ec3 ch\u1ee9a m\u00e3 nh\u00e0 s\u1ea3n xu\u1ea5t:<\/p>\n<pre class=\"wp-block-code\"><code>nano producer.py<\/code><\/pre>\n<p>Cung c\u1ea5p cho t\u1eadp tin nh\u1eefng n\u1ed9i dung sau:<\/p>\n<pre class=\"wp-block-code\"><code>import pika\n\nconnection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))\nchannel = connection.channel()\n\nchannel.queue_declare(queue='test_stream',\n                      durable=True,\n                      arguments={\"x-queue-type\": \"stream\"})\n\nchannel.basic_publish(exchange='',\n                      routing_key='test_stream',\n                      body='This is a test message.')\n\nprint(\"Sent message to stream.\")\n\nconnection.close()<\/code><\/pre>\n<p>M\u00e3 s\u1ea3n xu\u1ea5t b\u1eaft \u0111\u1ea7u b\u1eb1ng c\u00e1ch t\u1ea1o k\u1ebft n\u1ed1i \u0111\u1ebfn RabbitMQ. N\u00f3 s\u1eed d\u1ee5ng k\u1ebft n\u1ed1i n\u00e0y \u0111\u1ec3 t\u1ea1o h\u00e0ng&nbsp;<code>test_stream<\/code>\u0111\u1ee3i. B\u1ea1n ph\u1ea3i \u0111\u1ecbnh ngh\u0129a h\u00e0ng \u0111\u1ee3i l\u00e0 b\u1ec1n v\u1eefng, n\u1ebfu kh\u00f4ng b\u1ea1n s\u1ebd nh\u1eadn \u0111\u01b0\u1ee3c th\u00f4ng b\u00e1o l\u1ed7i. \u0110\u1eb7t \u0111\u1ed1i&nbsp;<code>x-queue-type<\/code>s\u1ed1 th\u00e0nh&nbsp;<code>stream<\/code>chuy\u1ec3n \u0111\u1ed5i h\u00e0ng \u0111\u1ee3i th\u00e0nh lu\u1ed3ng, b\u1ea1n c\u00f3 th\u1ec3 x\u00e1c minh th\u00f4ng qua b\u1ea3ng \u0111i\u1ec1u khi\u1ec3n RabbitMQ.<\/p>\n<p>Khi ho\u00e0n t\u1ea5t, nh\u1ea5n&nbsp;<kbd>CTRL<\/kbd>+&nbsp;<kbd>X<\/kbd>, ti\u1ebfp theo l\u00e0&nbsp;<kbd>Y<\/kbd>then&nbsp;<kbd>Enter<\/kbd>\u0111\u1ec3 l\u01b0u t\u1ec7p v\u00e0 tho\u00e1t&nbsp;<code>nano<\/code>.<\/p>\n<p>2.B\u00e2y gi\u1edd h\u00e3y t\u1ea1o m\u1ed9t t\u1ec7p python th\u1ee9 hai \u0111\u1ec3 ch\u1ee9a m\u00e3 ng\u01b0\u1eddi d\u00f9ng:<\/p>\n<pre class=\"wp-block-code\"><code>nano consumer.py<\/code><\/pre>\n<p>Cung c\u1ea5p cho t\u1eadp tin nh\u1eefng n\u1ed9i dung sau:<\/p>\n<pre class=\"wp-block-code\"><code>import pika\n\nconnection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))\nchannel = connection.channel()\n\nchannel.queue_declare(queue='test_stream',\n                      durable=True,\n                      arguments={\"x-queue-type\": \"stream\"})\n\ndef print_msg(msg):\n    print(f\"Received {msg}\")\n\ndef callback(ch, method, properties, body):\n    print_msg(body)\n\nchannel.basic_qos(prefetch_count=100)\n\nchannel.basic_consume('test_stream', callback)\n\nchannel.start_consuming()\n\nconnection.close()<\/code><\/pre>\n<p>M\u00e3 ng\u01b0\u1eddi d\u00f9ng nh\u1eadn b\u1ea5t k\u1ef3 tin nh\u1eafn m\u1edbi n\u00e0o \u0111\u01b0\u1ee3c g\u1eedi \u0111\u1ebfn lu\u1ed3ng. C\u1ea7n c\u00f3 m\u00e3 b\u1ed5 sung \u0111\u1ec3 truy c\u1eadp c\u00e1c tin nh\u1eafn \u0111\u00e3 c\u00f3 trong lu\u1ed3ng, nh\u01b0ng \u0111\u00e2y l\u00e0 \u0111i\u1ec3m kh\u1edfi \u0111\u1ea7u t\u1ed1t. N\u00f3 b\u1eaft \u0111\u1ea7u b\u1eb1ng c\u00e1ch thi\u1ebft l\u1eadp k\u1ebft n\u1ed1i v\u00e0 sau \u0111\u00f3 truy c\u1eadp lu\u1ed3ng. C\u0169ng nh\u01b0 khi g\u1eedi tin nh\u1eafn, h\u00e3y \u0111\u1ea3m b\u1ea3o r\u1eb1ng lu\u1ed3ng \u0111\u01b0\u1ee3c \u0111\u1ecbnh ngh\u0129a l\u00e0 b\u1ec1n v\u1eefng v\u00e0 bao g\u1ed3m c\u00e1c \u0111\u1ed1i s\u1ed1 ch\u00ednh x\u00e1c. \u1ee8ng d\u1ee5ng \u0111\u1eb7t s\u1ed1 l\u01b0\u1ee3ng truy xu\u1ea5t tr\u01b0\u1edbc b\u1eb1ng c\u00e1ch s\u1eed d\u1ee5ng&nbsp;<code>prefetch_count=100<\/code>. Thi\u1ebft l\u1eadp n\u00e0y ch\u1ec9 \u0111\u1ecbnh s\u1ed1 l\u01b0\u1ee3ng tin nh\u1eafn m\u00e0 ng\u01b0\u1eddi d\u00f9ng truy xu\u1ea5t t\u1eeb \u200b\u200blu\u1ed3ng c\u00f9ng m\u1ed9t l\u00fac. Ng\u01b0\u1eddi d\u00f9ng c\u00f3 th\u1ec3 x\u1eed l\u00fd m\u1ed9t lo\u1ea1t tin nh\u1eafn trong b\u1ed9 nh\u1edb c\u1ee5c b\u1ed9 tr\u01b0\u1edbc khi ph\u1ea3i th\u1ef1c hi\u1ec7n m\u1ed9t chuy\u1ebfn kh\u1ee9 h\u1ed3i kh\u00e1c \u0111\u1ebfn m\u00e1y ch\u1ee7. L\u1ec7nh g\u1ecdi \u0111\u1ebfn&nbsp;<code>channel.basic_consume()<\/code>x\u00e1c \u0111\u1ecbnh nh\u1eefng vi\u1ec7c c\u1ea7n l\u00e0m v\u1edbi tin nh\u1eafn khi \u0111\u1ebfn n\u01a1i. Sau khi \u1ee9ng d\u1ee5ng \u0111\u01b0\u1ee3c thi\u1ebft l\u1eadp, n\u00f3 s\u1ebd g\u1ecdi&nbsp;<code>channel.start_consuming()<\/code>\u0111\u1ec3 li\u00ean t\u1ee5c x\u1eed l\u00fd tin nh\u1eafn cho \u0111\u1ebfn khi nh\u1eadn \u0111\u01b0\u1ee3c l\u1ec7nh ng\u1eaft b\u00e0n ph\u00edm (&nbsp;<kbd>CTRL<\/kbd>+&nbsp;<kbd>C<\/kbd>).<\/p>\n<p>Khi ho\u00e0n t\u1ea5t, nh\u1ea5n&nbsp;<kbd>CTRL<\/kbd>+&nbsp;<kbd>X<\/kbd>, ti\u1ebfp theo l\u00e0&nbsp;<kbd>Y<\/kbd>then&nbsp;<kbd>Enter<\/kbd>\u0111\u1ec3 l\u01b0u t\u1ec7p v\u00e0 tho\u00e1t&nbsp;<code>nano<\/code>.<\/p>\n<p>3.\u0110\u1ec3 ki\u1ec3m tra \u1ee9ng d\u1ee5ng, tr\u01b0\u1edbc ti\u00ean h\u00e3y ch\u1ea1y m\u00e3 ng\u01b0\u1eddi d\u00f9ng:<\/p>\n<pre class=\"wp-block-code\"><code>python3 consumer.py\n<\/code><\/pre>\n<p>4.B\u00e2y gi\u1edd h\u00e3y m\u1edf c\u1eeda s\u1ed5 terminal th\u1ee9 hai v\u00e0 ch\u1ea1y m\u00e3 nh\u00e0 s\u1ea3n xu\u1ea5t:<\/p>\n<pre class=\"wp-block-code\"><code>python3 producer.py<\/code><\/pre>\n<p>Thi\u1ebft b\u1ecb \u0111\u1ea7u cu\u1ed1i c\u1ee7a nh\u00e0 s\u1ea3n xu\u1ea5t s\u1ebd hi\u1ec3n th\u1ecb th\u00f4ng b\u00e1o th\u00e0nh c\u00f4ng:<\/p>\n<pre class=\"wp-block-code\"><code>Sent message to stream.<\/code><\/pre>\n<p>Trong khi \u0111\u00f3, thi\u1ebft b\u1ecb \u0111\u1ea7u cu\u1ed1i c\u1ee7a ng\u01b0\u1eddi d\u00f9ng s\u1ebd hi\u1ec3n th\u1ecb th\u00f4ng b\u00e1o th\u1eed nghi\u1ec7m c\u1ee7a nh\u00e0 s\u1ea3n xu\u1ea5t:<\/p>\n<pre class=\"wp-block-code\"><code>Received b'This is a test message.'<\/code><\/pre>\n<p>5.Khi ho\u00e0n t\u1ea5t, nh\u1ea5n&nbsp;<kbd>CTRL<\/kbd>+&nbsp;<kbd>C<\/kbd>\u0111\u1ec3 d\u1eebng m\u00e3 ng\u01b0\u1eddi ti\u00eau d\u00f9ng.<\/p>\n<h2 id=\"conclusion\">Ph\u1ea7n k\u1ebft lu\u1eadn<a href=\"https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/#conclusion\"><\/a><\/h2>\n<p>C\u00e1c lu\u1ed3ng RabbitMQ m\u1edf ra v\u00f4 s\u1ed1 kh\u1ea3 n\u0103ng \u0111\u1ec3 l\u00e0m vi\u1ec7c v\u1edbi RabbitMQ. Quan tr\u1ecdng nh\u1ea5t l\u00e0 ch\u00fang l\u00e0m gi\u1ea3m l\u01b0\u1ee3ng c\u00f4ng vi\u1ec7c c\u1ea7n thi\u1ebft \u0111\u1ec3 tri\u1ec3n khai m\u1ed9t s\u1ed1 lo\u1ea1i t\u00ecnh hu\u1ed1ng l\u1eadp tr\u00ecnh nh\u1ea5t \u0111\u1ecbnh. S\u1eed d\u1ee5ng c\u00e1c lu\u1ed3ng an to\u00e0n, \u0111\u01a1n gi\u1ea3n v\u00e0 nh\u1ea5t qu\u00e1n, lo\u1ea1i b\u1ecf nhu c\u1ea7u c\u00e1c nh\u00e0 ph\u00e1t tri\u1ec3n ph\u1ea3i ph\u00e1t minh l\u1ea1i b\u00e1nh xe b\u1ea5t c\u1ee9 khi n\u00e0o c\u1ea7n m\u1ed9t h\u00e0ng \u0111\u1ee3i kh\u00f4ng ph\u00e1 h\u1ee7y.<\/p>\n<h2 id=\"more-information\">Th\u00f4ng tin th\u00eam<\/h2>\n<p>B\u1ea1n c\u00f3 th\u1ec3 mu\u1ed1n tham kh\u1ea3o c\u00e1c ngu\u1ed3n sau \u0111\u1ec3 bi\u1ebft th\u00eam th\u00f4ng tin v\u1ec1 ch\u1ee7 \u0111\u1ec1 n\u00e0y. M\u1eb7c d\u00f9 ch\u00fang t\u00f4i cung c\u1ea5p v\u1edbi hy v\u1ecdng r\u1eb1ng ch\u00fang s\u1ebd h\u1eefu \u00edch, nh\u01b0ng xin l\u01b0u \u00fd r\u1eb1ng ch\u00fang t\u00f4i kh\u00f4ng th\u1ec3 \u0111\u1ea3m b\u1ea3o t\u00ednh ch\u00ednh x\u00e1c ho\u1eb7c t\u00ednh k\u1ecbp th\u1eddi c\u1ee7a c\u00e1c t\u00e0i li\u1ec7u \u0111\u01b0\u1ee3c l\u01b0u tr\u1eef b\u00ean ngo\u00e0i.<\/p>\n<ul>\n<li><a href=\"https:\/\/www.rabbitmq.com\/queues.html\" target=\"_blank\" rel=\"noreferrer noopener\">RabbitMQ: H\u00e0ng \u0111\u1ee3i<\/a><\/li>\n<\/ul>\n<p> Ngu\u1ed3n : https:\/\/www.linode.com\/docs\/guides\/how-to-create-message-stream-rabbitmq\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Phi\u00ean b\u1ea3n 3.9 c\u1ee7a&nbsp;RabbitMQ&nbsp;gi\u1edbi thi\u1ec7u m\u1ed9t c\u1ea5u tr\u00fac d\u1eef li\u1ec7u m\u1edbi g\u1ecdi l\u00e0&nbsp;lu\u1ed3ng&nbsp;. Lu\u1ed3ng v\u00e0 h\u00e0ng \u0111\u1ee3i kh\u00e1c nhau v\u1ec1 c\u00e1ch ch\u00fang ho\u1ea1t \u0111\u1ed9ng v\u1edbi d\u1eef li\u1ec7u. Lu\u1ed3ng tin nh\u1eafn d\u1ef1a tr\u00ean \u0111\u0103ng k\u00fd, d\u1ef1a v\u00e0o t\u1ec7p nh\u1eadt k\u00fd \u0111\u01b0\u1ee3c s\u1eafp x\u1ebfp theo ch\u1ee7 \u0111\u1ec1 \u0111\u1ec3 ph\u00e2n ph\u1ed1i. Trong khi \u0111\u00f3, h\u00e0ng \u0111\u1ee3i tin nh\u1eafn<\/p>\n","protected":false},"author":1,"featured_media":35462,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[101],"tags":[],"class_list":["post-34867","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-big-data"],"_links":{"self":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/posts\/34867","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/comments?post=34867"}],"version-history":[{"count":0,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/posts\/34867\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/media\/35462"}],"wp:attachment":[{"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/media?parent=34867"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/categories?post=34867"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jupitek.maudemo.vip\/index.php\/wp-json\/wp\/v2\/tags?post=34867"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}