메시지 대기열이란 무엇입니까? 노드에서 메시지 큐를 사용하는 방법은 무엇입니까?
메시지 대기열이란 무엇인가요? 다음 문서에서는 메시지 대기열의 기본 개념을 안내하고 node에서 메시지 대기열을 사용하는 방법을 소개합니다.
1. 메시지 큐
메시지 큐란 무엇인가요?
메시지 큐는 메시지 전송 과정에서 메시지를 저장하는 컨테이너입니다. out)
메시지
는 전송해야 하는 데이터를 의미하며 텍스트, 문자열 또는 개체 및 기타 정보일 수 있습니다. 消息
指的是需要传输的数据,可以是一些文本,字符串,或者是对象等信息。
消息队列
则是两个应用间的通信服务,消息的产生者
将数据存放到消息队列中就可以立即返回,不需要等待消息的接收者
应答。即:生产者
保证数据插入队列,谁来取这条消息不需要管。消息的接收者
则只专注于接受消息并处理。
消息队列能做什么
解耦 上面介绍了,消息队列将消息的生产者和消息的接收者分开,彼此都不受影响。
异步 异步就是为了减少请求的响应时间,消息的生产者只需要处理简单的逻辑,并将数据放到消息队列中即可返回,复杂的逻辑,比如:数据库操作,IO操作由消息的接收者处理。
削峰 消息队列应用在服务时,能将瞬时大量涌入的请求信息保存到消息队列中,并立即返回。再由消息的接收者根据数据处理请求。
应用场景 游戏活动,秒杀活动,下单等会造成瞬时流量暴增的应用。
2.消息队列的概念
介绍完消息队列的基本信息,在开发消息队列之前先介绍一下消息队列的一些基本概念~
消息的生产者(producer)与消费者(customer)
上文提到的生产者
与消费者
,提供的是
链接,通道与队列
链接(connection):表示服务程序与消息队列之间的一条链接。一个服务程序可以创建多条链接。
通道(channel):消息队列链接之间的一个通,一个链接可以有多个通道。
队列(queue):消息队列中存放数据的队列,一个消息队列服务可以有多个队列。
总结一下,链接,通道队列之间的关系是这样的
交换机(exchange)
消息队列发送消息时必须要有一个交换机,如果没有指定则用的是默认的交换机。交换机的作用就是将消息才推到对应的队列中。消息队列中一共有4种交换机
Direct: 指定队列模式,消息来了,只发给指定的Queue,其他Queue都收不到。
fanout: 广播模式,消息来了,就会发送给所有的队列。
topic: 模糊匹配模式,通过模糊匹配的方式进行相应转发。
header: 与Direct模式类似。
3.node使用rabbitMQ
安装rabbitMQ
- 安装rabbitMQ可以通过官网上进行下载安装,传送门
- MAC可以直接用brew命令安装
brew install rabbitmq
로그인 후 복사 - 安装完成后启动rabbitmq服务
然后再本地中访问 http://localhost:15672/ 就可以看到rabbitmq服务的后台。初始的账号密码均为 guest
메시지 대기열
은 두 애플리케이션 간의 통신 서비스입니다. 메시지의 생성기
는 메시지< 코드를 기다리지 않고 메시지 대기열에 데이터를 저장한 후 즉시 반환할 수 있습니다. >수신자가 응답합니다. 즉, Producer
는 데이터가 대기열에 삽입되도록 하며 누가 메시지를 받는지는 중요하지 않습니다. 메시지의 수신자
는 메시지 수신 및 처리에만 집중합니다. 메시지 큐의 기능
- Decoupling🎜 위에서 소개한 것처럼 메시지 큐는 서로 영향을 주지 않고 메시지 생성자와 메시지 수신자를 분리합니다. 🎜
- 🎜🎜Asynchronous🎜 비동기식은 요청의 응답 시간을 줄이는 것입니다. 메시지 생성자는 간단한 논리만 처리하고 반환할 데이터를 메시지 대기열에 넣으면 됩니다. IO 작업은 🎜메시지 수신자🎜에 의해 처리됩니다. 🎜
- 🎜🎜Peak Shaving🎜 메시지 큐 애플리케이션이 서비스 중일 때 순간적으로 유입되는 요청 정보를 메시지 큐에 저장하고 즉시 반환할 수 있습니다. 그런 다음 메시지 수신자의 데이터를 기반으로 요청이 처리됩니다. 🎜
- 🎜🎜응용 시나리오🎜 게임 활동, 플래시 세일 활동, 주문 등 순간적인 트래픽 급증을 유발하는 응용 프로그램입니다. 🎜
🎜2. 메시지 큐의 개념🎜🎜🎜메시지 큐의 기본 정보를 소개한 후, 메시지를 개발하기 전에 메시지 큐에 대해 소개하겠습니다. 몇 가지 기본 개념~🎜🎜🎜🎜메시지의 생산자와 소비자🎜🎜🎜🎜위에 언급된 Producer
와 consumer
는 🎜🎜🎜🎜 링크로 제공됩니다. 채널 및 대기열 🎜🎜🎜- 🎜링크(연결): 서비스 프로그램과 메시지 대기열 간의 링크를 나타냅니다. 🎜서비스 프로그램은 여러 링크를 생성할 수 있습니다🎜. 🎜
- 🎜채널(채널): 메시지 대기열 링크 사이의 채널 🎜링크에는 여러 채널이 있을 수 있습니다🎜. 🎜
- 🎜큐(queue): 메시지 큐에 데이터를 저장하는 큐입니다. 메시지 큐 서비스는 여러 개의 큐를 가질 수 있습니다. 🎜
🎜결론적으로 링크와 채널 큐의 관계는 이렇습니다🎜🎜
🎜🎜🎜🎜Exchange(교환)🎜🎜🎜🎜Message queue🎜메시지를 보낼 때🎜🎜반드시🎜교환을 해야 합니다. 그렇지 않은 경우 지정하면 기본 스위치가 사용됩니다. 스위치의 역할은 해당 대기열에 메시지를 푸시하는 것입니다. 메시지 대기열에는 총 4가지 유형의 스위치가 있습니다🎜- 🎜직접: 메시지가 오면 지정된 대기열로만 전송되고 다른 대기열에서는 메시지가 수신되지 않습니다. . 🎜
- 🎜fanout: 방송 모드, 메시지가 오면 모든 대기열로 전송됩니다. 🎜
- 🎜topic: 퍼지 매칭 모드, 퍼지 매칭을 통해 해당 전달. 🎜
- 🎜헤더: 다이렉트 모드와 유사합니다. 🎜
🎜3.node는 RabbitMQ를 사용합니다🎜🎜🎜🎜🎜rabbitMQ 설치🎜🎜🎜- rabbitMQ 설치는 다음을 통해 수행할 수 있습니다. 공식 웹사이트 다운로드 및 설치, Portal🎜
- MAC을 사용할 수 있습니다 Brew 명령 직접
/** product.js 消费者 */
const amqplib = require('amqplib');
const config = require('./config');
const { connectUrl } = config;
(async () => {
const connection = await amqplib.connect(connectUrl);
const channel = await connection.createChannel();
const exchangeName = 'testExchange';
const key = 'testQueue';
const sendMsg = 'hello rabbitmq';
// 知道交换机类型
await channel.assertExchange(exchangeName, 'fanout', {
durable: true,
});
// 指定一个队列
await channel.assertQueue(key);
for (let i = 0; i < 100; i++) {
channel.publish(exchangeName, key, Buffer.from(`${sendMsg} ${i}`));
}
await channel.close();
await connection.close();
})();
로그인 후 복사로그인 후 복사 설치 - 설치가 완료된 후 Rabbitmq 서비스 시작
🎜
🎜🎜그런 다음 로컬에서 http://localhost:15672/를 방문하여 Rabbitmq 서비스의 배경을 확인하세요. 초기 계정 비밀번호는 guest
🎜🎜🎜🎜🎜🎜🎜노드 프로젝트 설치 amqplib🎜🎜🎜🎜amqplib는 노드에서 메시지 대기열을 사용하기 위한 도구 세트로, 메시지 대기열을 빠르게 사용할 수 있습니다🎜地址:https://www.npmjs.com/package/amqplib
- rabbitMQ 설치는 다음을 통해 수행할 수 있습니다. 공식 웹사이트 다운로드 및 설치, Portal🎜
- MAC을 사용할 수 있습니다 Brew 명령 직접 설치
/** product.js 消费者 */ const amqplib = require('amqplib'); const config = require('./config'); const { connectUrl } = config; (async () => { const connection = await amqplib.connect(connectUrl); const channel = await connection.createChannel(); const exchangeName = 'testExchange'; const key = 'testQueue'; const sendMsg = 'hello rabbitmq'; // 知道交换机类型 await channel.assertExchange(exchangeName, 'fanout', { durable: true, }); // 指定一个队列 await channel.assertQueue(key); for (let i = 0; i < 100; i++) { channel.publish(exchangeName, key, Buffer.from(`${sendMsg} ${i}`)); } await channel.close(); await connection.close(); })();
로그인 후 복사로그인 후 복사 - 설치가 완료된 후 Rabbitmq 서비스 시작
guest
🎜🎜🎜🎜🎜🎜🎜노드 프로젝트 설치 amqplib🎜🎜🎜🎜amqplib는 노드에서 메시지 대기열을 사용하기 위한 도구 세트로, 메시지 대기열을 빠르게 사용할 수 있습니다🎜地址:https://www.npmjs.com/package/amqplib
创建生产者
/** product.js 消费者 */ const amqplib = require('amqplib'); const config = require('./config'); const { connectUrl } = config; (async () => { const connection = await amqplib.connect(connectUrl); const channel = await connection.createChannel(); const exchangeName = 'testExchange'; const key = 'testQueue'; const sendMsg = 'hello rabbitmq'; // 知道交换机类型 await channel.assertExchange(exchangeName, 'fanout', { durable: true, }); // 指定一个队列 await channel.assertQueue(key); for (let i = 0; i < 100; i++) { channel.publish(exchangeName, key, Buffer.from(`${sendMsg} ${i}`)); } await channel.close(); await connection.close(); })();
运行后在后台可以看到新增了一个有100条消息的队列
创建消费者
/** customer.js 消费者 */ const amqplib = require('amqplib'); const config = require('./config'); const { connectUrl } = config; (async () => { let connection = await amqplib.connect(connectUrl); const exchangeName = 'testExchange'; const key = 'testQueue'; // 创建两个通道 const channel1 = await connection.createChannel(); const channel2 = await connection.createChannel(); // 指定一个交换机 await channel1.assertExchange(exchangeName, 'fanout', { durable: true, }); // 指定一个队列 await channel1.assertQueue(key); await channel1.bindQueue(key, exchangeName, key); channel1.consume(key, (msg) => { console.log('channel 1', msg.content.toString()); }); await channel2.assertExchange(exchangeName, 'fanout', { durable: true, }); await channel2.assertQueue(key); await channel2.bindQueue(key, exchangeName, key); channel2.consume(key, (msg) => { console.log('channel 2', msg.content.toString()); }); })();
执行后可以看到,两个通道可以同时工作接收消息
更多node相关知识,请访问:nodejs 教程!
위 내용은 메시지 대기열이란 무엇입니까? 노드에서 메시지 큐를 사용하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Non-Blocking, Event-Driven 기반으로 구축된 Node 서비스는 메모리 소모가 적다는 장점이 있으며, 대규모 네트워크 요청을 처리하는데 매우 적합합니다. 대규모 요청을 전제로 '메모리 제어'와 관련된 문제를 고려해야 합니다. 1. V8의 가비지 수집 메커니즘과 메모리 제한 Js는 가비지 수집 기계에 의해 제어됩니다.

이 기사는 NodeJS V8 엔진의 메모리 및 가비지 수집기(GC)에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다.

파일 업로드를 처리하는 방법은 무엇입니까? 다음 글에서는 Express를 사용하여 노드 프로젝트에서 파일 업로드를 처리하는 방법을 소개하겠습니다. 도움이 되길 바랍니다.

파일 모듈은 파일 읽기/쓰기/열기/닫기/삭제 추가 등과 같은 기본 파일 작업을 캡슐화한 것입니다. 파일 모듈의 가장 큰 특징은 모든 메소드가 **동기** 및 ** 두 가지 버전을 제공한다는 것입니다. 비동기**, sync 접미사가 있는 메서드는 모두 동기화 메서드이고, 없는 메서드는 모두 이기종 메서드입니다.

이 기사에서는 Node의 프로세스 관리 도구인 "pm2"를 공유하고 pm2가 필요한 이유, pm2 설치 및 사용 방법에 대해 설명합니다. 모두에게 도움이 되기를 바랍니다!

Pinetwork 노드에 대한 자세한 설명 및 설치 안내서이 기사에서는 Pinetwork Ecosystem을 자세히 소개합니다. Pi 노드, Pinetwork 생태계의 주요 역할을 수행하고 설치 및 구성을위한 전체 단계를 제공합니다. Pinetwork 블록 체인 테스트 네트워크가 출시 된 후, PI 노드는 다가오는 주요 네트워크 릴리스를 준비하여 테스트에 적극적으로 참여하는 많은 개척자들의 중요한 부분이되었습니다. 아직 Pinetwork를 모른다면 Picoin이 무엇인지 참조하십시오. 리스팅 가격은 얼마입니까? PI 사용, 광업 및 보안 분석. Pinetwork 란 무엇입니까? Pinetwork 프로젝트는 2019 년에 시작되었으며 독점적 인 Cryptocurrency Pi Coin을 소유하고 있습니다. 이 프로젝트는 모든 사람이 참여할 수있는 사람을 만드는 것을 목표로합니다.

이벤트 루프는 Node.js의 기본 부분이며 메인 스레드가 차단되지 않도록 하여 비동기 프로그래밍을 가능하게 합니다. 이벤트 루프를 이해하는 것은 효율적인 애플리케이션을 구축하는 데 중요합니다. 다음 기사는 Node.js의 이벤트 루프에 대한 심층적인 이해를 제공할 것입니다. 도움이 되기를 바랍니다!

노드가 npm 명령을 사용할 수 없는 이유는 환경 변수가 올바르게 구성되지 않았기 때문입니다. 해결 방법은 다음과 같습니다. 1. "시스템 속성"을 엽니다. 2. "환경 변수" -> "시스템 변수"를 찾은 다음 환경을 편집합니다. 3. nodejs 폴더의 위치를 찾습니다. 4. "확인"을 클릭합니다.
