当前位置: 首页 > wzjs >正文

学校资源网站建设网络营销方式有哪些视频

学校资源网站建设,网络营销方式有哪些视频,如何在阿里云部署网站,电子商务网站建设与策划exhcange交换机类型fanout和direct对比总结 特性Fanout 交换机Direct 交换机(默认类型)消息路由方式广播,忽略路由键精确匹配路由键绑定关系所有绑定到该交换机的队列都接收消息只有路由键匹配的队列接收消息使用场景日志系统、事件通知任务…

exhcange交换机类型fanout和direct对比总结

特性Fanout 交换机Direct 交换机(默认类型)
消息路由方式广播,忽略路由键精确匹配路由键
绑定关系所有绑定到该交换机的队列都接收消息只有路由键匹配的队列接收消息
使用场景日志系统、事件通知任务分配、错误处理
示例所有服务都需要接收相同的日志或通知不同类型的日志或任务被路由到不同队列

示例一 

使用Fanout 交换机实现广播,它不考虑任何路由键(routing key),而是将接收到的消息广播到所有绑定到该交换机的队列中。

producer.ts 发送消息,exchange类型fanout,队列和消息没有设置持久化,如果有消费者会接收到数据,没有消费者数据会丢失,重启rabbitmq数据会丢失。

import amqp from 'amqplib/callback_api';amqp.connect('amqp://admin:admin1234@localhost:5672', function (error0, connection) {if (error0) {throw error0;}connection.createChannel(function (error1, channel) {if (error1) {throw error1;}var exchange = 'exchange3';var msg = 'Hello World!';channel.assertExchange(exchange, 'fanout', {durable: false});channel.publish(exchange, '', Buffer.from(msg));console.log(" [x] Sent %s", msg);});setTimeout(function () {connection.close();process.exit(0);}, 500);
});

consumer.ts

import amqp from 'amqplib/callback_api';amqp.connect('amqp://admin:admin1234@localhost:5672', function (error0, connection) {if (error0) {throw error0;}connection.createChannel(function (error1, channel) {if (error1) {throw error1;}var exchange = 'exchange3';channel.assertExchange(exchange, 'fanout', {durable: false});channel.assertQueue('', {exclusive: true}, function (error2, q) {if (error2) {throw error2;}console.log(" [*] Waiting for messages in %s. To exit press CTRL+C", q.queue);channel.bindQueue(q.queue, exchange, '');channel.consume(q.queue, function (msg) {if (msg?.content) {console.log(" [x] %s", msg.content.toString());}}, {noAck: true});});});
});

 示例二

使用direct类型交换机,只有路由键匹配的队列会接收到消息(精确匹配),适合需要根据特定条件(如路由键)将消息路由到特定队列的场景,如任务分配、错误处理等。

producer.ts 发送消息routeKey指定为了route.key,设置了队列和消息持久化,publish发送时指定了route.key。

import RabbitMQ from 'amqplib/callback_api';function start() {RabbitMQ.connect("amqp://admin:admin1234@localhost:5672?heartbeat=60", function (err0, conn) {if (err0) {console.error("[AMQP]", err0.message);return setTimeout(start, 1000);}conn.on("error", function (err1) {if (err1.message !== "Connection closing") {console.error("[AMQP] conn error", err1.message);}});conn.on("close", function () {console.error("[AMQP] reconnecting");return setTimeout(start, 1000);});console.log("[AMQP] connected");conn.createChannel(async (err2, channel) => {if (err2) {console.error("[AMQP]", err2.message);return setTimeout(start, 1000);}const exchangeName = 'exchange1';channel.assertExchange(exchangeName,'direct',{durable: true},(err, ok) => {if (err) {console.log('exchange路由转发创建失败', err);} else {console.log('exchange路由转发创建成功', ok);for (let i = 0; i < 10; ++i) {// 给单个队列发送消息// console.log('message send!', channel.sendToQueue(//   queueName,//   Buffer.from(`发送消息,${i}${Math.ceil(Math.random() * 100000)}`),//   { persistent: true, correlationId: 'ooooooooooooooo' },// 消息持久化,重启后存在。//   // (err: any, ok: Replies.Empty)=>{}// ));console.log('消息发送是否成功', channel.publish(exchangeName,'route.key',Buffer.from(`发送消息,${i}${Math.ceil(Math.random() * 100000)}`),{ persistent: true },));}}});});setTimeout(() => {conn.close();process.exit(0);}, 1000);});
}start();

consumer.ts 绑定了exchange并指定了route.key,可以接收到生产者发送的消息。

import RabbitMQ, { type Replies } from 'amqplib/callback_api';RabbitMQ.connect('amqp://admin:admin1234@localhost:5672', (err0, conn) => {if (err0) {console.error(err0);return;}conn.createChannel(function (err1, channel) {const queueName = 'queue1';channel.assertQueue(queueName, { durable: true }, (err2, ok) => {if (err2) {console.log('队列创建失败', err2);return;}console.log('[*] waiting...');// 一次只有一个未确认消息,防止消费者过载channel.prefetch(1);channel.bindQueue(queueName, 'exchange1', 'route.key', {}, (err3, ok) => {console.log(queueName, '队列绑定结果', err3, ok);});channel.consume(queueName, function (msg) {console.log('接收到的消息', msg?.content.toString());// 手动确认取消channel.ack(msg);设置noAck:false,// 自动确认消息noAck:true,不需要channel.ack(msg);try {if (msg) {channel.ack(msg);}} catch (err) {if (msg) {// 第二个参数,false拒绝当前消息// 第二个参数,true拒绝小于等于当前消息// 第三个参数,3false从队列中清除// 第三个参数,4true从新在队列中排队channel.nack(msg, false, false);}console.log(err);}}, {// noAck: true, // 是否自动确认消息,为true不需要调用channel.ack(msg);noAck: false});});});conn.on("error", function (err1) {if (err1.message !== "Connection closing") {console.error("[AMQP] conn error", err1.message);}});conn.on("close", function () {console.error("[AMQP] reconnecting");});
});

 consumer2.ts

import RabbitMQ, { type Replies } from 'amqplib/callback_api';RabbitMQ.connect('amqp://admin:admin1234@localhost:5672', (err0, conn) => {if (err0) {console.error(err0);return;}conn.createChannel(function (err1, channel) {const queueName = 'queue2';channel.assertQueue(queueName, { durable: true }, (err2, ok) => {if (err2) {console.log('队列创建失败', err2);return;}console.log('[*] waiting...');// 一次只有一个未确认消息,防止消费者过载channel.prefetch(1);channel.bindQueue(ok.queue, 'exchange1', 'route.key', {}, (err3, ok) => {console.log(queueName, '队列绑定结果', err3, ok);});channel.consume(ok.queue, function (msg) {console.log('接收到的消息', msg?.content.toString());// 手动确认取消channel.ack(msg);设置noAck:false,// 自动确认消息noAck:true,不需要channel.ack(msg);try {if (msg) {channel.ack(msg);}} catch (err) {if (msg) {// 第二个参数,false拒绝当前消息// 第二个参数,true拒绝小于等于当前消息// 第三个参数,3false从队列中清除// 第三个参数,4true从新在队列中排队channel.nack(msg, false, false);}console.log(err);}}, {// noAck: true, // 是否自动确认消息,为true不需要调用channel.ack(msg);noAck: false});});});conn.on("error", function (err1) {if (err1.message !== "Connection closing") {console.error("[AMQP] conn error", err1.message);}});conn.on("close", function () {console.error("[AMQP] reconnecting");});
});

consumer3.ts

import RabbitMQ, { type Replies } from 'amqplib/callback_api';RabbitMQ.connect('amqp://admin:admin1234@localhost:5672', (err0, conn) => {if (err0) {console.error(err0);return;}conn.createChannel(function (err1, channel) {const queueName = 'queue3';channel.assertQueue(queueName, { durable: true }, (err2, ok) => {if (err2) {console.log('队列创建失败', err2);return;}console.log('[*] waiting...');// 一次只有一个未确认消息,防止消费者过载channel.prefetch(1);// 绑定的routeKey不同不会接收到route.key发送的消息channel.bindQueue(queueName, 'exchange1', 'routeKey', {}, (err3, ok) => {console.log(queueName, '队列绑定结果', err3, ok);});channel.consume(queueName, function (msg) {console.log('接收到的消息', msg?.content.toString());// 手动确认取消channel.ack(msg);设置noAck:false,// 自动确认消息noAck:true,不需要channel.ack(msg);try {if (msg) {channel.ack(msg);}} catch (err) {if (msg) {// 第二个参数,false拒绝当前消息// 第二个参数,true拒绝小于等于当前消息// 第三个参数,3false从队列中清除// 第三个参数,4true从新在队列中排队channel.nack(msg, false, false);}console.log(err);}}, {// noAck: true, // 是否自动确认消息,为true不需要调用channel.ack(msg);noAck: false});});});conn.on("error", function (err1) {if (err1.message !== "Connection closing") {console.error("[AMQP] conn error", err1.message);}});conn.on("close", function () {console.error("[AMQP] reconnecting");});
});

 

http://www.dtcms.com/wzjs/550679.html

相关文章:

  • 政务网站建设及管理网站做短链统计优缺点
  • 网站竞价如何做开发一款小程序需要多少钱
  • 在internet上建设网站招全国代理经销
  • 重庆制作企业网站wordpress找不到php的拓展
  • 网站悬浮qq怎样自己做网站赚钱吗
  • 制作一个网站能多少钱怎么建立一个网站平台高考加油
  • 建设银行网站安全分析安全员证书查询网入口
  • html源码网站下载之家如何修改网站后台代码
  • 做网站难度wordpress首页提示
  • 建设网站要求百度热议排名软件
  • 飞凡 做电商网站新闻热点事件摘抄2022
  • 长沙做暑假实践活动网站网站策划的内容包含了什么?
  • 网站开发人员名片网站建设那个好
  • 网站续费一般多少钱网站建站上海
  • 武夷山网站建设wzjseoseo网络推广软件
  • 专注番禺网站优化电子商务网站建设所需要的经费
  • 网站设计基本流程第一步中山大学精品课程网站
  • 全国推广优化网站个人网页设计作业
  • jquery 网站后台模板 仿做网站有什么用
  • 福永三合一网站设计设计房屋立体图的软件
  • 哈尔滨建设部网站品牌规划
  • 成都网站seo服务网站开发工程师职业定位
  • 手机点了钓鱼网站怎么办网站开发人员工具
  • 网站如何做tag如何在网上卖自己的产品
  • 企业网站带新闻发布功能的建站阿里巴巴官网登录
  • 官方建网站有哪些步骤深圳网站seo
  • 做设计用哪个素材网站学生个人网页制作免费
  • iis网站伪静态郑州 网站报价
  • 深圳外贸网站建设制作我的世界怎么自己做皮肤并上传网站
  • 模块建站工具包就业的培训机构