科技新闻

每日进步一点点:解读消息中间件—RabbitMQ(集群原理与搭建篇)

亡梦爱人 提交于 2020-03-17 22:51:53
摘要:实际生产应用中都会采用消息队列的集群方案,如果选择RabbitMQ那么有必要了解下它的集群方案原理 一般来说,如果只是为了学习RabbitMQ或者验证业务工程的正确性那么在本地环境或者测试环境上使用其单实例部署就可以了,但是出于MQ中间件本身的可靠性、并发性、吞吐量和消息堆积能力等问题的考虑,在生产环境上一般都会考虑使用RabbitMQ的集群方案。 对于RabbitMQ这么成熟的消息队列产品来说,搭建它并不难并且也有不少童鞋写过如何搭建RabbitMQ消息队列集群的博文,但可能仍然有童鞋并不了解其背后的原理,这会导致其遇到性能问题时无法对集群进行进一步的调优。本篇主要介绍RabbitMQ集群方案的原理,如何搭建具备负载均衡能力的中小规模RabbitMQ集群,并最后给出生产环境构建一个能够具备高可用、高可靠和高吞吐量的中小规模RabbitMQ集群设计方案。 一、RabbitMQ集群方案的原理 RabbitMQ这款消息队列中间件产品本身是基于Erlang编写,Erlang语言天生具备分布式特性(通过同步Erlang集群各节点的magic cookie来实现)。因此,RabbitMQ天然支持Clustering。这使得RabbitMQ本身不需要像ActiveMQ、Kafka那样通过ZooKeeper分别来实现HA方案和保存集群的元数据。集群是保证可靠性的一种方式

使用ivx学习开发通知和全局提示的经验总结

馋奶兔 提交于 2020-03-17 22:15:05
今天要给大家分享的经验是关于如何使用ivx创建一个通知的,通知就是悬浮出现在页面角落,显示全局的通知提醒消息,常用于:较为复杂的通知内容;带有交互的通知,给出用户下一步的行动点;系统主动推送。我依然使用官网来给大家进行分析: 1.我们先总体分析一下这个demo的结构: 这个demo的结构很简单,只有一个触发事件使用的按钮,和一个作为通知的横幅,横幅组件是一种特殊的定位工具,其可在滚动页面中处于固定位置而不随页面滚动。 2.先创建好满足需求的组件,也就是一个用来触发通告显示按钮,和触发后显示通知的顶部横幅,然后在横幅下创建好自己想要通知的内容就行了,这里这个内容是可以按自己的需求更改的,另外要注意记得预览前先将横幅隐藏,因为刚开始没有触发的时候通告是不显示的。 3.接下里我们看看这个触发通告的按钮的事件 因为,我们把通告的内容全部放在弹窗横幅下面的,所以,让通告显示只需要让弹窗横幅显示就行了,这里设置延迟是为了让用户看出变化,这样在弹窗显示的时候再点击的时候会有重新显示的视觉效果,这种设置常适用于登录按钮密码输入错误是发出通知的情况。 另外要给大家分享的经验是关于如何使用ivx创建一个全局提示的,全局通告类似于通知,但是信息内容常用于提示用户的操作反馈,且该提示内容会在延迟时间后自动消失,且一般不可与之交互。我依然使用官网来给大家进行分析: 1.我们先总体分析一下这个demo的结构:

消息队列常见的几种使用场景介绍

倾然丶 夕夏残阳落幕 提交于 2020-03-17 21:29:31
某厂面试归来,发现自己落伍了!>>> 一、简介 消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。实现高性能、高可用 、 可伸缩和最终一致性架构。使用较多的消息队列有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ。 二、消息队列应用场景 以下介绍消息队列在实际应用中常用的使用场景:异步处理,应用解耦,流量削锋和消息通讯四个场景。 1、异步处理 场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种:串行的方式和并行方式。 串行方式 :将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户。 并行方式 :将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。 假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。 因为CPU在单位时间内处理的请求数是一定的,假设CPU1秒内吞吐量是100次。则串行方式1秒内CPU可处理的请求量是7次(1000/150)。并行方式处理的请求量是10次(1000/100)。 小结 :如以上案例描述,传统的方式系统的性能(并发量,吞吐量,响应时间)会有瓶颈。如何解决这个问题呢?

学习笔记

喜夏-厌秋 提交于 2020-03-17 20:43:09
一、密码相关内容 skytale密码、凯撒密码、几何图形密码、轮子密码机 古典密码学(替代密码、凯撒密码、置换密码)、近代密码学、现代密码学(解决密钥分发) 信息安全的主要属性:机密性(明文变密文)、完整性、可鉴别性、不可否认性、授权与访问控制 密码——对称加密:加密密钥等于解密密钥;流密码和分组密码 ECB模式的加密:明文分组加密形成密文分组 CBC模式的加密:引入初始化向量 CFB模式的加密:初始化向量进行加密 CTR模式的加密:计数器模式每次加一累积 密码——非对称加密:公钥和私钥(密钥对) 加密:接收方的公钥加密私钥解密 数字签名:发送方用私钥加密(生成签名),接收方用公钥解密(验证签名) 认证:哈希,消息-单项散列函数-散列值(固定长度值) 哈希函数保证完整性 消息认证码保证完整性和认证:通过计算的MAC值对比(共享密码) 盐(随机生成) 口令+盐生成单项散列函数 PKI的组成要素:认证机构,证书(用户的公钥加机构的数字签名) 2015年电子签名法:CA,电子签名需第三方认证 2020.1.1《密码法》:商用密码算法SM1/4 密码,是指采用特定变换的方法对信息等进行加密保护、安全认证的技术、产品和服务。 密码分为核心密码、普通密码和商用密码。 核心密码、普通密码用于保护国家秘密信息,核心密码保护信息的最高密级为绝密级,普通密码保护信息的最高密级为机密级。

大数据学习——actor编程

末鹿安然 提交于 2020-03-17 18:52:53
1 概念 Scala中的Actor能够实现并行编程的强大功能,它是基于事件模型的并发机制,Scala是运用消息(message)的发送、接收来实现多线程的。使用Scala能够更容易地实现多线程应用的开发。 2 传统java并发编程与scala actor编程的区别 对于Java,我们都知道它的多线程实现需要对共享资源(变量、对象等)使用synchronized 关键字进行代码块同步、对象锁互斥等等。而且,常常一大块的try…catch语句块中加上wait方法、notify方法、notifyAll方法是让人很头疼的。原因就在于Java中多数使用的是可变状态的对象资源,对这些资源进行共享来实现多线程编程的话,控制好资源竞争与防止对象状态被意外修改是非常重要的,而对象状态的不变性也是较难以保证的。 而在Scala中,我们可以通过复制不可变状态的资源(即对象,Scala中一切都是对象,连函数、方法也是)的一个副本,再基于Actor的消息发送、接收机制进行并行编程 3 actor方法执行顺序 1.首先调用start()方法启动Actor 2.调用start()方法后其act()方法会被执行 3.向Actor发送消息 发送消息的方式 ! 发送异步消息,没有返回值。 !? 发送同步消息,等待返回值。 !! 发送异步消息,返回值是 Future[Any]。 例子 添加依赖 <!--scala

Java的学习 | 反射

依然范特西╮ 提交于 2020-03-17 18:22:50
文章目录 什么是反射? Java反射机制提供的功能 反射相关的主要API Class类 理解Class类 获取 Class的实例 的方式(前三种方式需要掌握) 什么是反射? Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于 Reflection API 取得任何类的内部消息,并能直接操作任意对象的内部属性及方法。 正常方式:引入需要的“包类”名称 → 通过new实例化 → 取得实例化对象 反射方式:实例化对象 → getClass() 方法 → 得到完整的“包类”名称 Java反射机制提供的功能 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时获取泛型消息 在运行时调用任意一个对象的成员变量和方法 在运行时处理注解 生成动态代理 反射相关的主要API java.lang.Class : 代表一个类 java.lang.reflect.Method : 代表类的方法 java.lang.reflect.Field : 代表类的成员变量 java.lang.reflect.Constructor : 代表类的构造器 . . . . . . Class类 理解Class类 关于 java.lang.Class类 的理解 类的加载过程: 程序经过 javac.exe 命令以后

Redis(8)——发布/订阅与Stream

跟風遠走 提交于 2020-03-17 18:19:33
一、Redis 中的发布/订阅功能 发布/ 订阅系统 是 Web 系统中比较常用的一个功能。简单点说就是 发布者发布消息,订阅者接受消息 ,这有点类似于我们的报纸/ 杂志社之类的: (借用前边的一张图) 图片引用自:「消息队列」看过来! - https://www.wmyskxz.com/2019/07/16/xiao-xi-dui-lie-kan-guo-lai/ 从我们 前面(下方相关阅读) 学习的知识来看,我们虽然可以使用一个 list 列表结构结合 lpush 和 rpop 来实现消息队列的功能,但是似乎很难实现实现 消息多播 的功能: 为了支持消息多播, Redis 不能再依赖于那 5 种基础的数据结构了,它单独使用了一个模块来支持消息多播,这个模块就是 PubSub ,也就是 PublisherSubscriber (发布者/ 订阅者模式) 。 PubSub 简介 我们从 上面的图 中可以看到,基于 list 结构的消息队列,是一种 Publisher 与 Consumer 点对点的强关联关系, Redis 为了消除这样的强关联,引入了另一种概念: 频道 (channel) : 当 Publisher 往 channel 中发布消息时,关注了指定 channel 的 Consumer 就能够同时受到消息。但这里的 问题 是,消费者订阅一个频道是必须 明确指定频道名称 的

Ajax跨域请求怎么解决?

心已入冬 提交于 2020-03-17 17:12:40
前言    项目中需要将第三方系统中,对应用户的代办消息集成到系统中。对方提供了获取对应用户的接口url,但是由于两边的系统是部署到客户现场不同IP的虚机上的,所以进行ajax请求的时候是属于跨域请求的。之前基本没有出现过这种情况,但是知道有跨域这个点,具体怎么解决,只知道ajax 有datatype:'jsonp' 是解决跨域请求的。但是当时并没有解决问题,因为后台数据接口并没有提供jsonp格式的函数方法,而只是json。用ajax解析json 的那一套去解析jsonp,当然行不通了。 跨域请求的迹象?    No 'Access-Control-Allow-Origin' header is present on the requested resource.   此时就是在提示你 存在跨域请求,我也是在这个时候发现 了进行了跨域请求。然后,我在ajax中添加了 datatype:'jsonp' (不了解的童鞋请查看jquery官方文档中的$.ajax部分)进行跨域请求。但是,添加以后,居然还是提示错误: Uncaught SyntaxError: Unexpected token : (出现这个问题的原因就是 使用ajax 解析json 的方式直接去解析了jsonp格式,钥匙对不上锁...) 这个时候,就由于对跨域请求不是有很多了解,导致我知道出现了什么问题

Android的Handler,Message,Looper的原理详解

狂风中的少年 提交于 2020-03-17 16:46:20
某厂面试归来,发现自己落伍了!>>> 先说说Looper类:Looper就是为每一个线程创建一个Looper对象,维护一个MessageQueue,并循环从MessageQueue中取出消息并分发给Handler执行。下面是Looper源码中如何使用的一个示例 class LooperThread extends Thread { * public Handler mHandler; * * public void run() { * Looper.prepare(); * * mHandler = new Handler() { * public void handleMessage(Message msg) { * // process incoming messages here * } * }; * * Looper.loop(); * } * } 我们看看Looper.prepare干了些什么事 public static void prepare() { prepare(true); } //判断当前线程是否有Looper对象,没有则new一个并放到ThreadLocal中 private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new