科技新闻

RabbitMQ学习系列(六):RabbitMQ消息确认机制

被刻印的时光 ゝ 提交于 2020-02-28 22:15:17
(一)概述 rabbitmq在使用过程中会遇到一个问题:生产者将消息发送出去后,消息有没有达到rabbitmq,默认是不知道的。 有两种解决方式:1.AMQP实现事务机制;2.Confirm模式 (二)事务机制 事务机制通过三段代码控制事务的执行: 1 channel.txSelect(); 将当前channel设置成transaction 2 channel.txCommit(); 提交事务 3 channel.txRollback(); 事务回滚 如果生产者因为一些错误没有将事务发送出去,那就会触发事务回滚机制,以达到消息确认的目的。 通过简单队列实现事务机制: 生产者 public class Sent { private static final String QUEUE_NAME="tx_queue"; public static void main(String[] args) throws IOException, TimeoutException { Connection connection = ConnectionUtil.getConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME,false,false,false,null);

rocketmq 消息队列的顺序性问题

纵然是瞬间 提交于 2020-02-28 21:29:46
为了实现分布式系统可扩展、可伸缩性的关键组件,需要具有高吞吐量、高可用等特点。我们很多时候都会考虑将消息系统纳入我们的选择中;比如我一个登录事件,有可能我登录之后需要做很多东西,比如日志,比如发布消息,比如推送,再比如发送代金券等等;这些事件与登录息息相关,但是本质上它们与登录这个事件没有直接的关系,只是在登录事件后,系统按照需求需要去初始化一些东西,或者去记录一些东西等等;如果把所有的东西都纳入到登录这个事件中(同一个事物中),那登录的事件内处理的逻辑更多,会造成什么后果?登录时间很长,让用户无法忍受,另外,假如登录过程中出现了未发现异常,那是不是导致用户直接无法登录?为了解决这样的问题,我们引入了消息系统,比如我这台机登录过后,我将登录的一些信息,通过远程方式发送到另外一台机器上(或者同一台机),让它们去处理相应的后续逻辑实现; 目的是:1、用户登录更快,体验上更好, 2、只要保证登录部分完整,即便后续出错,并不影响用户正常使用,即容错性更强! 谈到消息系统,首先想到的第一个问题肯定会是: 消息的顺序性 本来很想说一下关于消息顺序性的一些问题,不过由于我也是借鉴了一些其他的帖子,以及官方的文档,所以这里就不会去赘述这些了,稍后我会分享一些很不错的链接,留给自己以后看,也希望可以给一些刚好要入门rocketmq的网友提供一些资料; rocketmq是阿里云的一套开源产品

STUN, TURN, ICE介绍

那年仲夏 提交于 2020-02-28 21:00:41
STUN STUN协议为终端提供一种方式能够获知自己经过NAT映射后的地址,从而替代位于应用层中的私网地址,达到NAT穿透的目的。STUN协议是典型的Client-Server协议,各种具体应用通过嵌入STUN客户端与STUN Server端通讯来完成交互。 在典型的运用STUN进行NAT穿透的场景中,STUN客户端首先向位于公网上的STUN服务器 发送Binding Request消息,STUN服务器接收到请求消息后识别出经过NAT转换后的公网地址60.1.1.1:12345,将其附加在Binding Response消息中返回给客户端。客户端得到这个地址 后用它替换SDP中的私网地址与终端B完成媒体协商。使用STUN进行NAT穿透对应用的要 求是必须使用同样的端口与STUN服务器交互和进行应用层通讯,比如当希望使用端口 37000进行RTP包的NAT穿透时,必须同样使用37000端口与STUN服务器通讯,否则从STUN 服务器获得的NAT映射后的地址一般与实际地址时不一样的。另一个要求是STUN客户端与 服务器端的通讯和应用使用获得的NAT映射地址进行应用层通讯在时间上必须有连贯性, 这源于NAT设备建立的绑定有生存时间,当原绑定消亡后,NAT设备为同一个私网地址建 立的新绑定往往不同,因此转换后的公网地址是不同的。 STUN方案的特性如下表: 特性 说明 实现复杂度 实现简单

xmpp学习笔记(三)

孤者浪人 提交于 2020-02-28 20:35:42
四:自动连接 从当前代码来看,如果有意外的断开,我们将无法获取信息。 所以要添加 XMPPReconnect xmppReconnect = [[ XMPPReconnect alloc ] init ]; [ xmppReconnect activate : self . xmppStream ]; 五:发送和接收消息 XEP-0136 布置好自己的聊天页面,包括用来展示聊天记录的UITableView,和发送消息的按钮。 发送消息代码如下: 接收消息: 当有消息进来后,调用 - ( void )xmppStream:( XMPPStream *)sender didReceiveMessage:( XMPPMessage *)message 方法 xmpp的框架自有消息存储的功能,用法与朋友列表类似。 发送消息后,查看文件夹,发现已经多了一个消息的数据库,所有的消息都存储在这里。 用类似朋友列表的方法取得了聊天信息的记录,包括时间、信息、接收人、发送或者接收信息的判断标志,信息到手,SM去吧! 依然是无法实时更新的问题,正在努力寻找合适的方法解决。 语音聊天 进行语音连天有两种方式:base64编码和Http http的方式是在消息中添加http的连接,如果用户要点击播放则去下载。 base64则是将音频文件转换成base64,按照发送文本信息的模式发送,接收到后,进行解码。

微信开发文档笔记整理(一)

前提是你 提交于 2020-02-28 19:43:21
1.微信的服务器配置说明:(用户发给公众号的消息以及开发者需要的事件推送,将被微信转发到该URL)验证算法如下: 微信服务器会对填写的服务器页面里的URL附带四个参数,服务器指定URL在获取到了三个参数后,若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。下面是示例验证成功代码: function checkSignature() { $signature = $_GET ["signature"]; $timestamp = $_GET ["timestamp"]; $nonce = $_GET ["nonce"]; $tmpArr = array ( 'weiphp', $timestamp, $nonce ); sort ( $tmpArr, SORT_STRING ); $tmpStr = sha1 ( implode ( $tmpArr ) ); if ($tmpStr == $signature) { echo $_GET ["echostr"]; } } PS:这是一种通讯加密机制,大部分接口都有一套自己的加密机制(这里是将token、timestamp、nonce三个参数进行字典序排序,然后 将三个参数字符串拼接成一个字符串进行sha1加密)验证成功后,接入生效 2.业务逻辑原理: 服务器被验证成功后

RabbitMQ入门

你。 提交于 2020-02-28 18:47:58
文章目录 一、rabbitMQ简介 各大主流中间件对比: 初识RabbitMQ RabbitMQ高性能的原因? 什么是AMQP高级消息队列协议? AMQP核心概念(重点) 二、rabbitMQ安装及使用(两种) Centos安装方式 Docker安装方式 常用操作命令 三、rabbitMQ快速入门 四、交换机 直流交换机 主题交换机 输出交换机 一、rabbitMQ简介 各大主流中间件对比: ActiveMQ ActiveMQ 是 Apache 出品,最流行的,能力强劲的开源消息总线,并且它一个完全支持 J M S 规范的消息中间件。 其丰富的 API 、多种集群构建模式使得他成为业界老牌消息中间件,在中小型企业中应用广泛! MQ 衡量指标:服务性能、数据存储、集群架构 Kafka 用来做日志分析的 RocketMQ RocketMQ是阿里开源的消息中间件,目前也已经孵化为Apache顶级项目,它是纯java开发,具有高吞吐量、高可用性、适合大规模分布式系统 应用的特点。 RocketMQ思路起源于Kafka,它对消息的可靠传输及事务 性做了优化,目前在阿里集团被广泛应用于交易、充值、流计算、消息推 送、日志流式处理、binglog分发等场景 RabbitMQ RabbitMQ是使用Erlang语言开发的开源消息队列系统,基于AMQP协议 来实现。 AMQP的主要特征是面向消息

Celery的基本使用

ぃ、小莉子 提交于 2020-02-28 17:59:01
Celery 1、什么是Celery Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统,专注于实时处理的异步任务队列,同时也支持任务调度。 用Python写的执行 定时任务和异步任务的框架 执行异步任务: 创建任务:tasks.py 把任务添加到队列中:add_task.py 开启work,执行任务 用命令:celery -A tasks worker -l info 在 Windows下:celery -A tasks worker -l info -P eventlet 查看任务结果:task_resut.py 多任务结构: 重点:执行work的时候:celery -A tasks worker -l info -P eventlet 2、Celery架构 Celery的架构由三部分组成,消息中间件,任务执行单元和任务执行结果存储(task result store )组成。 消息中间件 Celery本身不提供消息服务,但是可以方便的和第三方提供的消息中间件集成。包括,RabbitMQ, Redis等等 任务执行单元 Worker是Celery提供的任务执行的单元,worker并发的运行在分布式的系统节点中。 任务结果存储 Task result store用来存储Worker执行的任务的结果,Celery支持以不同方式存储任务的结果,包括AMQP, redis等

Netty-NioEventLoop线程工作机制

别来无恙 提交于 2020-02-28 17:56:09
I/O读写操作原理 异步任务执行原理 定时任务执行原理 Netty多线程最佳实践 I/O读写操作原理 NioEventLoop作为Reactor线程,负责TCP连接的创建和接入,以及TCP消息的读写,Reactor线程职责如下: 作为NIO服务端,接受客户端的TCP连接 作为NIO客户端,向服务端发起TCP连接 读取通信对端的请求或者应答信息 向通信对端发送消息请求或者应答消息 由于Reactor模式使用的是异步非阻塞I/O,因此所有的I/O操作都不会导致阻塞,理论上一个线程可以独立处理所有I/O相关操作。但对于高负载、大并发的应用场景却不适合。原因如下: 一个NIO线程同时处理成百上千条链路,在性能上无法支撑,即便NIO线程的CPU负荷达到100%,也无法满足海量消息的编码、解码、读取和发送需求。 当NIO线程负载过重时,处理速度将变慢,这回导致大量客户端连接超时,超时之后往往会进行重发消息,这更加加重NIO线程的负荷,最终将导致大量消息积压和处理超时,成为系统的性能瓶颈。 可靠性问题:一旦NIO线程出现意外,会导致整个系统通信模块不可用,不能接受和处理外部消息,造成节点故障。 对于Netty,在创建NioEventLoopGroup时可以指定工作的I/O线程数,通常为"CPU内核书X2"或者"CPU内核书+1",这样可提升网络的读写性能,需要指出的是,不要把I

jQuery验证:更改默认错误消息

浪尽此生 提交于 2020-02-28 17:48:13
有没有一种简单的方法可以更改 jQuery验证插件中 的默认错误值? 我只想重写错误消息以使其对我的应用程序更加个性化-我有很多字段,所以我不想为字段x单独设置消息...我知道我可以做到! #1楼 这对我有用: $.validator.messages.required = 'required'; #2楼 要删除所有默认错误消息,请使用 $.validator.messages.required = ""; #3楼 最新版本可以执行一些不错的内联操作。 如果这是一个简单的输入字段,则可以像这样添加属性 data-validation-error-msg data-validation-error-msg="Invalid Regex" 如果您需要一些更重的东西,则可以使用带有所有值的变量完全自定义内容,这些变量将传递给validate函数。 请参考此链接以获取全部详细信息 -https://github.com/victorjonsson/jQuery-Form-Validator#fully-customizable #4楼 除了这些自定义错误消息,我们还可以指定文本字段的类型。 例如:将字段类型设置为type ='email' 然后插件将识别该字段并正确验证。 #5楼 这对我有用: // Change default JQuery validation Messages. $(

android常用组件之Spinner

帅比萌擦擦* 提交于 2020-02-28 17:16:51
Spinner是下拉列表框,用户可以通过该控件从所列item中进行选择,还可以触发item的监听事件。 该实例通过ArrayAdapter类创建了含有30个item的下拉列表,当用户从所列的item中进行选择后,会弹出一个消息框,提示用户所选条目。注意spinner条目监听方法是setOnItemSelectedListener(),而不是setOnItemClickListener(),如果使用setOnItemClickListener()方法会出现秒退现象。 首先是布局文件,添加一个Spinner组件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="main.test_spinner.MainActivity" > <Spinner android:id="@+id/spinner1"