第8章 跨越集群的界限

跨越同步的界限:Java与RabbitMQ携手实现高效异步处理 RabbitMQ是一个开源的消息代理软件(也称为消息导向中间件),它实现了高级消息队列协议(AMQP)。作为一款轻量级且易于部署的消息队列服务,RabbitMQ以其卓越的稳定性和丰富的功能特性赢得了广泛的认可。跨平台支持:能够在多种操作系统上运行,包括Linux、Windows和macOS。多语言兼容:提供了对众多编程语言的支持,如Java、Python、Ruby等,方便不同技术栈的应用集成。持久化保障:即使遇到服务器故障,未被消费的消息也不会丢失,保证了消息传递的可靠性。灵活性强。 阅读详情

第8章 跨越集群的界限

8.1 Federation

Federation插件的设计目标是使RabbitMQ在不同的Broker节点之间进行消息传递而无须建立集群,该功能在很多场景下都非常有用:

Federation插件能够在不同管理域(可能设置了不同的用户和vhost,也可能运行在不同版本的RabbitMQ和Erlang上)中的Broker或集群之间传递消息。

Federatin插件基于AMQP 0-9-1 协议在不同的Broker之间进行通信,并设计成能够容忍不稳定的网络连接情况。

一个Broker节点中可以同时存在联邦交换器(或队列)或者本地交换器(或队列),只需要对特定的交换器(或队列)创建Federation连接(Federation link)。

Federation不需要在N个Broker节点之间创建O(N2)个连接(尽管这是最简单的使用方式),这也就意味着Federation在使用时更容易扩展。

Federation 插件可以让多个交换器或者多个队列进行联邦。一个联邦交换器(federated exchange)或则一个联邦队列(federated queue)接收上游(upstream)的消息,这里的上游是指位于其他Broker上的交换器或者队列。联邦交换器能够将原本发送给上游交换器(upstream exchange)的消息路由到本地的某个队列中;联邦队列则允许一个本地消费者接收到来自上游队列(upstream queue)的消息。

为了能够详细解释Federation,我们先从架构来分析联邦交换器和联邦队列,之后再来讲解如何使用Federation。

8.1.1 联邦交换器

假设图8-1中broker1部署在北京,broker2部署在上海,而broker3部署在广州,彼此之间相距甚远,网络延迟是一个不得不面对的问题。

图 8-1 联邦交换器

有一个在广州的业务ClientA需要连接broker3,并向其中的交换器exchangeA发送消息,此时的网络延迟很小,ClientA可以迅速将消息发送至exchangeA中,就算在开启了publisher confirm机制或者事务机制的情况下,也可以迅速收到确认消息。

此时又有一个在北京的业务ClientB需要向exchangeA发送消息,那么ClientB与broker3之间有很大的网络延迟,ClientB将发送消息至exchangeA会经历一定的延迟,尤其是在开启了publiser confirm 机制或者事务机制的情况下,ClientB会等待很长的延迟时间来接受broker3的确认信息,进而必然造成这条发送线程的性能降低,甚至造成一定程度上的阻塞。

那么要怎么优化业务ClientB呢?将业务ClientB部署到广州的机房中可以解决这个问题,但是如果ClientB调用的另一些服务都部署在北京,那么又会引发新的时延问题,总不见得将所有业务全部部署在一个机房,那么容灾又何以实现?这里使用Federation插件就可以很好地解决这个问题。

如图8-2所示,在broker3中为交换器exchangeA(broker3中的队列queueA通过“rkA”与exchangeA进行了绑定)与广州的broker1之间建立一条单向的Federation link。此时Federation插件会在broker1上会建立一个同名的交换器exchangeA(这个名称可以配置,默认同名),同时建立一个内部的交换器“exchangeA -> broker3 B”,并通过路由键“rkA”将这两个交换器绑定起来。这个交换器“exchangeA -> broker3 B”名字中的“broker3”是集群名,可以通过 rabbitmqctl set_cluster_name {new_name}命令进行修改。

与此同时Federation插件还会在broker1上建立一个队列“federation:exchangeA->broker3 B”,并与交换器“exchangeA->broker3 B”进行绑定。

Federation插件会在队列“federation:exchangeA->broker3”与broker3中的交换器exchangeA之间建立一条AMQP连接来实时地消费队列“federation:exchangeA->borker3 B”中的数据。这些操作都是内部的,对外部业务客户端来说这条Federation link建立在broker1的exchangeA和broker3的exchangeA之间。

图 8-2 建立Federation link​​​

回到前面的问题,部署在北京的业务ClientB可以连接broker1并向exchangeA发送消息,这样ClientB可以迅速发送完消息并收到确认信息,而之后消息会通过Federation link转发到broker3的交换器exchangeA中。经过Federation link 转发的消息会带有特殊的headers属性标记。例如向broker1中的交换器exchangeA发送一条内容为“federation test payload.”的持久化消息,之后可以在broker3中的队列queueA中消费到这条消息,详细如图8-3所示。

图 8-3 消息的内容

Federation 不仅便利于消息生产方,同样也便利于消息消费方。

假设某生产者将消息存入broker1中的某个队列queueB,在广州的业务ClientC想要消费queueB的消息,消息的流转及确认必然要忍受较大的网络延迟,内部编码逻辑也会因这一因素变得更加复杂,这样不利于ClientC的发展。不如将这个消息转发的过程以及内部复杂的编码逻辑交给Federation去完成,而业务方在编码时不必再考虑网络延迟的问题。Federation使得生产者和消费者可以异地部署而又让这两方感受不到过多的差异。

图 8-2 中 broker1 的队列“federation:exchangeA->broker3 B”是一个相对普通的队列,可以直接通过客户端进行消费。假设此时还有一个客户端ClientD通过Basic.Consume来消费队列“federation:exchangeA->broker3 B”的消息,那么发往broker1中的exchangeA的消息会有一部分(一半)被ClientD消费掉,而另一半会发往broker3的exchangeA。所以如果业务应用有要求所有发往broker1中的exchangeA的消息都要转发至broker3的exchangeA中,此时就要注意队列“federation:exchangeA->broker3 B”不能有其他的消费者;而对于“异地均摊消费”这种特殊需求,队列“federation:exchangeA->broker3 B”这种天生特性提供了支持。对于broker1的交换器exchangeA而言,它是一个普通的交换器,可以创建一个新的队列绑定它,对它的用法没有什么特殊之处。

如图 8-4 所示,一个federated exchange 同样可以成为另一个交换器的upstream exchange。

图 8-4 federated exchange 成为另一个交换器的 upstream exchange

同样如图 8-5 所示,两方的交换器可以互为federated exchange 和 upstream exchange。其中参数“max_hops=1”表示一条消息最多被转发的次数为1。

图 8-5 两方的交换器互为federated exchange 和 upstream exchange

需要特别注意的是,对于默认的交换器(每个vhost下都会默认创建一个名为“”的交换器)和内部交换器而言,不能对其使用Federation的功能。

对于联邦交换器而言,还有更复杂的拓扑逻辑部署方式。比如图8-6中“fan-out”的多叉树形式,或者图8-7中“三足鼎立”的情形。 

图 8-6 “fan-out”的多叉树

 

图 8-7 “三足鼎立”

还有环形的拓扑部署,如图8-8所示。关于更多的拓扑部署就留给读者自行思考了。

图 8-8 环形的拓扑部署

 

 

8.1.2 联邦队列

除了联邦交换器,RabbitMQ还可以支持联邦队列(federated queue)。联邦队列可以在多个Broker节点(或者集群)之间为单个队列提供均衡负载的功能。一个联邦队列可以连接一个或者多个上游队列(upstream queue),并从这些上游队列中获取消息以满足本地消费者消费消息的需求。

图8-9演示了位于两个Broker中的几个联邦队列(灰色)和非联邦队列(白色)。队列queue1和queue2原本在broker2中,由于某种需求将其配置为federated queue并将broker1作为upstream。Federation 插件会在broker1上创建同名的队列queue1和queue2,与broker2中的队列queue1和queue2分别建立两条单向独立的Federation link。当消费者ClientA连接broker2并通过Basic.Consume消费队列queue1(或queue2)中的消息时,如果队列queue1(或queue2)中本身有若干消息堆积,那么ClientA直接消费这些消息,此时broker2中的queue1(或queue2)并不会拉取broker1中的queue1(或queue2)的消息;如果队列queue1(或queue2)中没有消息堆积或者消息被消费完了,那么它会通过Federation link拉取在broker1中的上游队列queue1(或queue2)中的消息(如果有消息),然后存储到本地,之后再被消费者ClientA进行消费。

图 8-9 联邦队列

消费者既可以消费broker2中的队列,又可以消费broker1中的队列,Federation的这种分布式队列的部署可以提升单个队列的容量。如果在broker1一端部署的消费者来不及消费队列queue1中的消息,那么broker2一端部署的消费者可以为其分担消费,也可以达到某种意义上的负载均衡。

和federated exchange 不同,一条消息可以在联邦队列间转发无限次。如图8-10中两个队列queue互为联邦队列。

图 8-10 互为联邦队列

队列中的消息除了被消费,还会转向有多余消费能力的一方,如果这种“多余的消费能力”在broker1和broker2中来回切换,那么消费也会在broker1和broker2中的队列queue中来回转发。 

可以在其中一个队列上发送一条消息“msg”,然后再分别创建两个消费者ClientB和ClientC分别连接broker1和broker2,并消费队列queue中的消息,但是并不需要确认消息(消费完消息不需要调用Basic.Ack)。来回开启/关闭ClientB和ClientC可以发现消息“msg”会在broker1和broker2之间串来串去。

图 8-11 中的 broker2 的队列queue 没有消息堆积或者消息被消费完之后并不能通过Basic.Get来获取broker1中队列queue的消息。因为Basic.Get是一个异步的方法,如果要从broker1中队列queue拉取消息,必须要阻塞等待通过Federation link拉取消息存入broker2中的队列queue之后再消费消息,所以对于federated queue 而言只能使用Basic.Consume进行消费。

federated queue并不具备传递性。考虑图 8-11 的情形,队列queue2作为federated queue 与 队列 queue1 进行联邦,而队列 queue2 又作为队列 queue3 的 upstream queue,但是这样队列queue1与queue3之间并没有产生任何联邦的关系。如果队列queue1中有消息堆积,消费者连接broker3消费queue3中的消息,无论queue3处于何种状态,这些消费者都消费不到queue1中的消息,除非queue2有消费者。

图 8-11 联邦队列的传递性

注意要点:

理论上可以将一个federated queue与一个federated exchange 绑定起来,不过这样会导致一些不可预测的结果,如果对结果评估不足,建议慎用这种搭配方式。 

8.1.3 Federation的使用

为了能够使用Federation功能,需要配置以下2个内容:

(1)需要配置一个或多个upstream,每个upstream均定义了到其他节点的Federation link。这个配置可以通过运行时的参数(Runtime Parameter)来完成,也可以通过federation management插件来完成。

(2)需要定义匹配交换器或者队列的一种/多种策略(Policy)。

Federation 插件默认在RabbitMQ发布包中,执行 rabbitmq-plugins enable rabbitmq_federation 命令可以开启Federation功能。

由前面的讲解可知,Federation内部基于AMQP协议拉取数据,所以在开启rabbitmq_federation插件的时候,默认会开启amqp_client插件。同时,如果要开启Federation的管理插件,需要执行 rabbitmq-plugins enable rabbitmq_federation_management 命令。

注意要点:

当需要在集群中使用Federation功能的时候,集群中所有的节点都应该开启Federation插件。

有关Federation upstream 的信息全部都保存在RabbitMQ的Mnesia数据库中,包括用户信息、权限信息、队列信息等。在Federation中存在3种级别的配置。

(1)Upstreams:每个upstream用于定义与其他Broker建立连接的信息。

(2)Upstream sets:每个upstream set 用于对一系列使用Federation功能的upstream进行分组。

(3)Policies:每一个Policy会选定出一组交换器,或者队列,亦或者两者皆有而进行限定,进而作用于一个单独的upstream或者upstream set之上。

正确地使用Federation插件,首先以图8-2中broker1和broker3的关系来讲述如何建立federated exchange。

第一步

需要在broker1和broker3中开启rabbitmq_federation插件,最好同时开启rabbitmq_federation_management插件。

第二步

在broker3中定义一个upstream。

rabbitmqctl set_parameter federation-upstream f1 '{"uri":"amqp://root:root@192.168.0.2:5672","ack-mode":"on-confirm"}'

通用的参数如下所述

  • Name:定义这个upstream的名称。必填项。
  • URI:定义upstream的AMQP连接。必填项。
  • Prefetch count(prefetch_count):定义Federation内部缓存的消息条数,即在收到上游消息之后且在发送到下游之前缓存的消息条数。
  • Reconnect delay(reconnect-delay):Federation link 由于某种原因断开之后,需要等待多少秒开始重新建立连接。
  • Acknowledgement Mode(ack-mode):定义Federation link的消息确认方式。共有3种:on-confirm、on-publish、no-ack。默认为on-confirm,表示在接收到下游的确认消息(等待下游的Basic.Ack)之后再向上游发送消息确认,这个选项可以确保网络失败或者Broker宕机时不会丢失消息,但也是处理速度最慢的选项。如果设置为on-publish,则表示消息发送到下游后(并不需要等待下游的Basic.Ack)再向上游发送消息确认,这个选项可以确保在网络失败的情况下不会丢失消息,但不能确保Broker宕机时不会丢失消息。no-ack表示无须进行消息确认,这个选项处理速度最快,但也最容易丢失消息。
  • Trust User-ID(trust-user-id):设定Federation是否使用“Validated User-ID”这个功能。如果设置为false或者没有设置,那么Federation会忽略消息的user_id这个属性;如果设置为true,则Federation只会转发user_id为上游任意有效的用户的消息。

第三步

定义一个Policy用于匹配交换器exchangeA,并使用第二步中所创建的upstream。

rabbitmqctl set_policy --apply-to exchanges p1 "^exchange" '{"federation-upstream":"f1"}'

8.2 Shovel

8.2.1 Shovel的原理

8.2.2 Shovel的使用

8.2.3 案例:消息堆积的治理

Ansys CFX Pre 中 RGP 表的高级配置与优化策略 本文深入探讨了Ansys CFX Pre中RGP表的高级配置与优化策略,旨在帮助用户将仿真从“能用”提升至“精准好用”。文章重点解析了如何根据具体仿真场景,科学设定温度压力范围、选择流体类型,并针对相变等复杂工况实施网格加密与分离建表等关键优化技术,以显著提升计算精度与稳定性。 阅读详情

相关推荐

ESP-CSI:使用ESP32进行CSI(信道状态信息)采集

使用esp32进行csi(信道状态信息)采集和处理

capsize的博客 8280

四、RabbitMQ分布式

一、集群 如果RabbitMQ服务器遇到内存崩溃、机器掉电或者主板故 障等情况,该怎么办?单台RabbitMQ服务器可以满足每秒1000条消息的吞吐量,那么如果应 用需要RabbitMQ服务满足每秒10万条消息的吞吐量呢?购买昂贵的服务器来增强单机 RabbitMQ服务的性能显得捉襟见肘,搭建一个RabbitMQ集群才是解决实际问题的关键。 RabbitMQ集群允许消费者和生产者在RabbitMQ单个节点崩溃的情况下继续运行,它可以 通过添加更多的节点来线性地扩展消息通信的吞吐量。当失去一个Rabbit

wind_cp的博客 960

「 网络安全常用术语解读 」软件成分分析SCA详解:从发展背景到技术原理再到业界常用检测工具推荐

软件成分分析(Software Composition Analysis,SCA)是一种用于识别和分析软件内部组件及其关系的技术,旨在帮助开发人员更好地了解和管理其软件的构建过程,同时可帮助安全人员揭秘软件内部结构的神秘面纱。SCA技术的发展与软件行业的快速发展密不可分,下面将介绍SCA的发展背景、技术原理以及当前主流SCA工具。

所有成功的背后,都是痛苦的坚持,所有的痛苦,都是傻瓜般的不放弃! 5628

RabbitMQ 教程 | 第8章 跨越集群的界限

这篇 RabbitMQ 教程为学习者提供了全面的内容,帮助学习者充分掌握 RabbitMQ 的应用。整篇教程丰富内容详实,适合初学者和有经验的开发者参考学习。

编程洪同学 427

取证实战:当嫌疑人电脑已关机,如何利用EFDD从休眠文件提取BitLocker密钥?

本文详细介绍了如何利用Elcomsoft Forensic Disk Decryptor(EFDD)从休眠文件(hiberfil.sys)中提取BitLocker密钥的实战技术。通过分析休眠文件中的内存快照,取证人员可以突破已关机加密设备的防线,获取关键解密信息。文章涵盖了工具配置、镜像获取、密钥提取及验证等完整流程,并提供了疑难问题解决方案和法律合规建议。

weixin_29315091的博客 340

51单片机计算器(源程序+流程图+答辩报告+综合设计)

保姆级讲解!C语言编程,使用51单片机及LCD1602显示屏实现!

m0_57007304的博客 2万+

RabbitMQ实战指南 - 笔记

目录 第1章 RabbitMQ简介 第2章 RabbitMQ入门 第3章 客户端开发向导 第4章 RabbitMQ进阶 第5章 RabbitMQ管理 第6章 RabbitMQ配置 第7章 RabbitMQ运维 7.3 单节点故障恢复 第8章 跨越集群的界限 第9章 RabbitMQ高阶 第10章 网络分区 第11章 RabbitMQ扩展 附录A 集群元数据信息示例 SpringBoot 整合 RabbitMQ 第1章 RabbitMQ简介 第2章 RabbitMQ入门 .

limeOracle的博客 525

【A_Star三维路径规划】基于matlab A_Star算法结合B样条平滑三维地形路径规划(含雷达威胁)【含Matlab源码 3527期】

A_Star算法结合B样条平滑三维地形路径规划(含雷达威胁) 完整代码,包运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 740

《RabbitMQ实战指南》你看了吗?

RabbitMQ是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件。首先要知道一些RabbitMQ的特点,官网可查:RabbitMQ 是目前非常热门的一款消息中间件,不管是互联网行业还是传统行业都在大量地使用 RabbitMQ 凭借其高可靠、易扩展、高可用及丰富的功能特性受到越来越多企业的青睐。作为一个合格的开发者,有必要深入地了解 RabbitMQ 的相关知识,为自己的职业生涯添砖加瓦。今天咱们就来一起学习一下连阿里架构师都在推荐渣渣们学习的《RabbitMQ实战指南》以及

老男孩的架构路 341

Python控制程控电源(USB)

随着智能电动汽车行业的持续发展,汽车电子或嵌入式设备在软硬件的测试中,都会使用程控电源供电,特别是自动化测试、压力测试场景必定使用到程控电源控制,控制电源上下电,监听电源电流、电压等,以下就以常见的艾德克斯程控电源为例,分享如何通过USB连接方式Python语言来控制程控电源。

测试领域技术分享 2864

【AI智能体】Dify 搭建发票识别助手操作实战详解

Dify 搭建发票识别专属助手操作实战详解

congge 5549

阿里P8大佬十年经验总结,把RabbitMQ+RocketMQ讲透了

都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!(img-VHtWNlLw-1712523453128)](img-l6eI8Exi-1712523453128)]分享一份自己整理好的Java面试手册,还有一些面试题pdf。分享一份自己整理好的Java面试手册,还有一些面试题pdf。2.RocketMQ路由中心NameServer。获取和调试RocketMQ的源代码。3.RocketMQ消息发送。漫谈RocketMQ消息发送。4.RocketMQ消息存储。

2401_84046912的博客 672

USLE模型(1.2):LS因子的计算

基于USLE的甘南川西北土壤侵蚀研究。准备好30米分辨率的dem。

所有专家都曾始于新手 3481

夜天之书 #28 What is Open Source

昨天回答了知乎问题《开源(open source)是什么?为什么要开源?》[1],搬运过来混一天。关于开源的定义和名词讨论,可以参考下面两份材料。The Open Source Defin...

Miracle 602

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

RabbitMQ实战指南笔记

目录 第1章 RabbitMQ简介 1.1 什么是消息中间件 1.2 消息中间件的作用 1.3 RabbitMQ起源 1.4 RabbitMQ的安装及简单实用 第2章 RabbitMQ入门 2.1 概念介绍 2.2 AMQP协议介绍 第3章 客户端开发向导(php-amqplib) 3.1 连接RabbitMQ 3.2 使用交换器和队列 3.3 发送消息 3.4 消...

青鬆下的ミ坚躯 的个人博客 1879

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Alibaba十年开发架构师,心血浇筑“MQ技术手册”

前言 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。虽然说,目前状况是Kafka更为火热,但更为广泛的应该还属老牌的RabbtiMQ和Alibaba自主研发的RocketMQ。 关于MQ相关的内容,Alibaba肯定还是很有话语权的,尤其是关于RocketMQ的使用,所以今天我们要分享的内容,实际上就是阿里P8的十年开发经验总结,写出来的这本“RabbitMQ+RocketMQ”技术手册,看完你也不得不感

weixin_50666791的博客 131

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

在三线公司做开发五年,竟然连消息队列都不知道,看完阿里巴巴首发的这份“MQ技术手册”,惊呆了~

前言 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。虽然说,目前状况是Kafka更为火热,但更为广泛的应该还属老牌的RabbtiMQ和Alibaba自主研发的RocketMQ。 关于MQ相关的内容,Alibaba肯定还是很有话语权的,尤其是关于RocketMQ的使用,所以今天我们要分享的内容,实际上就是阿里P8的十年开发经验总结,写出来的这本“RabbitMQ+RocketMQ”技术手册,看完你也不得不感

如果频繁就私信一下呢 358

rabbitmq 延迟队列_RabbitMQ实战指南

资料简介:本书从消息中间件的概念和RabbitMQ的历史切入,主要阐述RabbitMQ的安装、使用、配置、管理、运维、原理、扩展等方面的细节。本书大致可以分为基础篇、进阶篇和高阶篇三个部分。基础篇首先介绍RabbitMQ的基本安装及使用方式,方便零基础的读者以*舒适的方式融入到RabbitMQ之中。其次介绍RabbitMQ的基本概念,包括生产者、消费者、交换器、队列、绑定等。之后通过Ja...

weixin_39631755的博客 113

Alibab流出的这本“MQ技术手册”,看完我愣住了!

前言 消息队列已经逐渐成为企业IT系统内部通信的核心手段。它具有低耦合、可靠投递、广播、流量控制、最终一致性等一系列功能,成为异步RPC的主要手段之一。虽然说,目前状况是Kafka更为火热,但更为广泛的应该还属老牌的RabbtiMQ和Alibaba自主研发的RocketMQ。 关于MQ相关的内容,Alibaba肯定还是很有话语权的,尤其是关于RocketMQ的使用,所以今天我们要分享的内容,实际上就是阿里P8的十年开发经验总结,写出来的这本“RabbitMQ+RocketMQ”技术手册,看完你也不得不感

weixin_59330273的博客 282

Alibaba开发十年,写出这本“MQ技术手册”,看完我愣住了

关于MQ相关的内容,Alibaba肯定还是很有话语权的,尤其是关于RocketMQ的使用,所以今天我们要分享的内容,实际上就是阿里P8的十年开发经验总结,写出来的这本“RabbitMQ+RocketMQ”技术手册,看完你也不得不感叹这份极品手册啊!会用到什么程度了呢?添加图片注释,不超过 140 字(可选)添加图片注释,不超过 140 字(可选)添加图片注释,不超过 140 字(可选)添加图片注释,不超过 140 字(可选)添加图片注释,不超过 140 字(可选)添加图片注释,不超过 140 字(可选)

m0_63437643的博客 225

第十四章—分布式处理、客户/服务器和集群【计算机操作系统】

14.1 什么是客户/服务器计算? 客户/服务器计算是一个网络环境,在这个网络环境中包含着客户机和服务器,并由服务器来响应客户机的请求。 14.2 客户/服务器计算与任何其他形式的分布式数据处理的区别是什么? 1、在用户的本地系统上为该用户提供界面友好的应用程序,这样做可使系统具有更高的可靠性。这使得用户可以在很大程度上控制对计算机的使用方式和时间,并使得部门级管理者具有响应本地需求的能...

周末参见 867

hcna网络技术学习指南_双Q合璧:RabbitMQ与RocketMQ,电子版手绘脑图+学习指南+面试...

先来谈谈RabbitMQ不多说,上一份我手绘的RabbitMQ思维脑图,先来总体的梳理一下各知识点手绘的RabbitMQ思维脑图额,这个手绘电子版的RabbitMQ知识大纲,有点不太好展示,截图可以看见里面的内容比较多,可能看不清楚,等下后面会细说一下说到RabbitMQ,其实它已是目前非常热门的一款消息中间件,不管是互联网行业还是传统行业都在大量地使用,并且RabbitMQ有以下4大优点:高可靠...

weixin_39851279的博客 230

讯飞星火与华为数据存储强强联手,“以存强算” 助力AI集群算力利用率飙升30%

通过使用统一的AI数据湖存储大模型数据,可实现冷热数据分级存储,跨越数据孤岛,打破数据界限,确保了模型内数据的高效流动,为大模型训练做好充分的数据准备。实践出真知,相信这种源自讯飞星火与华为数据存储双方的技术与经验,深度耦合而“孵化”出来的AI存储解决方案,必将能够加速AI Ready的数据基础设施建设,为客户带来高性能、高扩展和更智能的AI训推体验,推动AI产业发展,将AI大模型的算力真正转化为企业组织的新质生产力!此外,优化存储架构和采用更适合大模型训练的存储解决方案,也可以提高训练效率‌。

luluningmeng1的博客 321

最新阿里P8大佬十年经验总结,把RabbitMQ+RocketMQ讲透了,你连原理都还没弄明白

笔者已经把面试题和答案整理成了面试专题文档本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取[外链图片转存中…(img-ZihgBHL9-1715684097372)][外链图片转存中…(img-8NAd1Mdu-1715684097372)][外链图片转存中…(img-usOXlAKR-1715684097373)][外链图片转存中…(img-kaMgjjXv-1715684097373)]

2401_84585234的博客 994
上一篇: 第5章 RabbitMQ管理
下一篇: 第7章 RabbitMQ运维
limeOracle
博客等级 码龄10年 11粉丝 566原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值