消息机制

spring-session(一)揭秘续篇

妖精的绣舞 提交于 2019-11-28 14:50:48
上一篇文章中介绍了Spring-Session的核心原理,Filter,Session,Repository等等,传送门: spring-session(一)揭秘 。 这篇继上一篇的原理逐渐深入Spring-Session中的事件机制原理的探索。众所周知,Servlet规范中有对HttpSession的事件的处理,如:HttpSessionEvent/HttpSessionIdListener/HttpSessionListener,可以查看 Package javax.servlet 在Spring-Session中也有相应的Session事件机制实现,包括Session创建/过期/删除事件。 本文主要从以下方面探索Spring-Session中事件机制 Session事件的抽象 事件的触发机制 Note: 这里的事件触发机制只介绍基于RedissSession的实现。基于内存Map实现的MapSession不支持Session事件机制。其他的Session实现这里也不做关注。 一.Session事件的抽象 先来看下Session事件抽象UML类图,整体掌握事件之间的依赖关系。 Session Event最顶层是ApplicationEvent,即Spring上下文事件对象。由此可以看出Spring-Session的事件机制是基于Spring上下文事件实现。

Http缓存机制

冷暖自知 提交于 2019-11-28 07:06:44
什么是Http缓存 缓存缓存,就是把需要的东西存起来,不需要每次都去请求。主要目的减小服务器压力,放到客户端上来讲,还利于节省流量,还能流畅的把UI显示出来,提高了用户体验。对于Http缓存来讲,主要的就是校验缓存的有效性,也就是新鲜度。如果客户端不能及时响应服务端的数据变化,缓存一直不能被更新,那不就是得不偿失了? Http缓存策略 1.Expires策略 Expires是Web服务器响应消息头字段,在响应http请求时告诉浏览器在过期时间前浏览器可以直接从浏览器缓存取数据,而无需再次请求。Expires规定了缓存失效时间,客户端拿当前时间和这个失效时间比较,如果超过了这个时间,即无效。 Expires策略有2个明显的缺点: 1.缓存时间依赖于客户端,每个客户端的时间可能不相同,精度不高。 2.缓存有效期的时间精度不高。 举个例子,一个新闻列表的缓存时间是有后台运营决定的,当我产生这个列表的时候是无法确定该列表到底多久以后会被更新,只能预估一个时间。只有当列表被更新,我才知道这个更新时间之前的资源都是过期的。 而且,Expires是HTTP1.0的东西,而Cache-Control是HTTP1.1的,规定如果max-age和Expires同时存在,前者优先级高于后者 2.Cache-control策略 Cache -Control指定请求和响应遵循的缓存机制。

消息中间件选型分析从Kafka与RabbitMQ的对比来看全局

为君一笑 提交于 2019-11-27 22:58:27
原 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局https://blog.csdn.net/u013256816/article/details/79838428版权声明:本文为博主原创文章,未经博主朱小厮允许不得转载。 https://blog.csdn.net/u013256816/article/details/79838428 本文收录于InfoQ,未经允许不得转载。 一、前言 消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下提供应用解耦、弹性伸缩、冗余存储、流量削峰、异步通信、数据同步等等功能,其作为分布式系统架构中的一个重要组件,有着举足轻重的地位。 目前开源的消息中间件可谓是琳琅满目,能让大家耳熟能详的就有很多,比如ActiveMQ、RabbitMQ、Kafka、RocketMQ、ZeroMQ等。不管选择其中的哪一款,都会有用的不趁手的地方,毕竟不是为你量身定制的。有些大厂在长期的使用过程中积累了一定的经验,其消息队列的使用场景也相对稳定固化,或者目前市面上的消息中间件无法满足自身需求,并且也具备足够的精力和人力而选择自研来为自己量身打造一款消息中间件。但是绝大多数公司还是不会选择重复造轮子

Netlink机制详解

爷,独闯天下 提交于 2019-11-27 16:52:08
使用netlink机制在内核与应用程序之间通信 转载:https://blog.csdn.net/zoe6553/article/details/8026033 前一段时间,在开发一个驱动程序的过程中,需要在驱动程序与应用程序之间进行通信。其中驱动程序在接收到一个硬件中断之后通知应用程序进行相应的处理。为 解决此类问题,驱动程序提供了几种机制:(1)使用copy_to_user/copy_from_user方法,缺点是通信响应时间过长(2)使用信 号,但是限于字符设备(3)使用netlink。 在linux2.4之后引入了netlink机制,它将是Linux用户态与内核态交流的主要方法之一。netlink 的特点是对中断过程的支持,也就是说,可以在中断程序中直接调用netlink相关函数。它在内核空间接收用户空间数据时不再需要用户自行启动一个内核线 程,而是通过另一个软中断调用用户事先指定的接收函数。netlink的通信过程如下: 下面分用户空间与内核空间2个部分讲述netlink的基本使用方法 1. 用户空间的程序 用户的应用程序使用标准套接字socket与内核空间进行通讯,标准socket API的函数, socket()、 bind()、sendmsg()、recvmsg() 和 close()很容易地应用到 netlink socket。 程序代码: #define

MQ消息队列

纵然是瞬间 提交于 2019-11-27 09:52:40
大家平时也有用到一些消息中间件(MQ),但是对其理解可能仅停留在会使用API能实现生产消息、消费消息就完事了。 对MQ更加深入的问题,可能很多人没怎么思考过。 比如,你跳槽面试时,如果面试官看到你简历上写了,熟练掌握消息中间件,那么很可能给你发起如下 4 个面试连环炮! 为什么要使用MQ? 使用了MQ之后有什么优缺点? 怎么保证MQ消息不丢失? 怎么保证MQ的高可用性? 本文将通过一些场景,配合着通俗易懂的语言和多张手绘彩图,讨论一下这些问题。 为什么要使用MQ? 相信大家也听过这样的一句话:好的架构不是设计出来的,是演进出来的。 这句话在引入MQ的场景同样适用,使用MQ必定有其道理,是用来解决实际问题的。而不是看见别人用了,我也用着玩儿一下。 其实使用MQ的场景有挺多的,但是比较核心的有3个: 异步、解耦、削峰填谷 异步 我们通过实际案例说明:假设A系统接收一个请求,需要在自己本地写库执行SQL,然后需要调用BCD三个系统的接口。 假设自己本地写库要3ms,调用BCD三个系统分别要300ms、450ms、200ms。 那么最终请求总延时是3 + 300 + 450 + 200 = 953ms,接近1s,可能用户会感觉太慢了。 此时整个系统大概是这样的: 但是一旦使用了MQ之后,系统A只需要发送3条消息到MQ中的3个消息队列,然后就返回给用户了。 假设发送消息到MQ中耗时20ms

iOS面试题

淺唱寂寞╮ 提交于 2019-11-27 09:37:51
文章转载自: http://www.pythonheidong.com/blog/article/3327/ iOS面试题 1. Difference between shallow copy and deep copy? 浅复制和深复制的区别? 浅层复制:指向对象的指针,而不复制引用对象本身。深层复制:复制引用对象本身。 2.What is advantage of categories? What is difference between implementing a category and inheritance? 类别的作用?继承和类别在实现中有何区别? category可以在不熟悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。并且如果类别和原来类中的方法名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。 类别主要有3个作用: (1)将类的实现分散到多个不同文件或多个不同框架中。 (2)创建对私有方法的前向引用。 (3)向对象添加非正式协议。 继承可以添加,修改或删除方法,并且可以增加属性。 3.Difference between categories and extensions? 类别和类扩展的区别。 categories和extensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。

如何保证消息的可靠性传输

ⅰ亾dé卋堺 提交于 2019-11-27 07:39:10
如何保证消息的可靠性传输 面试题引入 面试题剖析 RabbitMQ Kafka 面试题引入 如何保证消息的可靠性传输?其实就是在问你,如何保证消息不丢失。用消息有个基本原则,就是数据不能多一条,也不能少一条,不能多,就是前文说的重复消费和幂等性问题。不能少,就是说这数据别搞丢了。那这个问题你必须得考虑一下。 面试题剖析 数据的丢失问题,可能出现在生产者、MQ、消费者中,我们从 RabbitMQ 和 Kafka 分别来分析一下吧。 RabbitMQ 生产者弄丢了数据   生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题什么的,都有可能。   此时可以选择用 RabbitMQ 提供的事务功能,就是生产者发送数据之前开启 RabbitMQ 事务channel.txSelect,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txRollback,然后重试发送消息;如果收到了消息,那么可以提交事务channel.txCommit。 // 开启事务 channel . txSelect try { // 这里发送消息 } catch ( Exception e ) { channel . txRollback // 这里再次重发这条消息 } // 提交事务 channel .

Zookeeper Watcher和选举机制

♀尐吖头ヾ 提交于 2019-11-27 07:36:47
Watcher 在ZooKeeper中,接口类Watcher用于表示一个标准的事件处理器,其定义了事件通知相关的逻辑,包含KeeperState和EventType两个枚举类,分别代表了通知状态和事件类型,同时定义了事件的回调方法:process(WatchedEvent event)。 7.1什么是Watcher接口 同一个事件类型在不同的通知状态中代表的含义有所不同,表7-3列举了常见的通知状态和事件类型。 表7-3 Watcher通知状态与事件类型一览 KeeperState EventType 触发条件 说明 None (-1) 客户端与服务端成功建立连接 SyncConnected (0) NodeCreated (1) Watcher监听的对应数据节点被创建 NodeDeleted (2) Watcher监听的对应数据节点被删除 此时客户端和服务器处于连接状态 NodeDataChanged (3) Watcher监听的对应数据节点的数据内容发生变更 NodeChildChanged (4) Wather监听的对应数据节点的子节点列表发生变更 Disconnected (0) None (-1) 客户端与ZooKeeper服务器断开连接 此时客户端和服务器处于断开连接状态 Expired (-112) Node (-1) 会话超时 此时客户端会话失效

Watcher监听和选举机制

二次信任 提交于 2019-11-27 07:29:16
在 ZooKeeper中,接口类Watcher用于表示一个标准的事件处理器,其定义了事件通知相关的逻辑,包含KeeperState和EventType两个枚举类,分别代表了通知状态和事件类型,同时定义了事件的回调方法:process(WatchedEvent event)。 一,什么 是 Watcher 接口 同一个事件类型在不同的通知状态中代表的含义有所不同,表 7-3列举了常见的通知状态和事件类型。 表 7-3 Watcher通知状态与事件类型一览 KeeperState EventType 触发条件 说明 None (-1) 客户端与服务端成功建立连接 SyncConnected (0) NodeCreated (1) Watcher监听的对应数据节点被创建 NodeDeleted (2) Watcher监听的对应数据节点被删除 此时客户端和服务器处于连接状态 NodeDataChanged (3) Watcher监听的对应数据节点的数据内容发生变更 NodeChildChanged (4) Wather监听的对应数据节点的子节点列表发生变更 Disconnected (0) None (-1) 客户端与ZooKeeper服务器断开连接 此时客户端和服务器处于断开连接状态 Expired (-112) Node (-1) 会话超时 此时客户端会话失效

进程、线程以及IPC---linux

牧云@^-^@ 提交于 2019-11-27 07:08:05
进程(标识pid) <unistd.h> <sys/types.h> 资源集合:内存 文件 时间片 协处理器 完全复制:复制前执行什么,复制后执行什么 fork() 系统调用函数fork()是创建一个新进程的唯一方式 一次复制一个进程 返回值-1,创建失败; 返回值 0,进入子进程; 一般来说,fork()成功之后,父进程与子进程的执行顺序是不确定的。这取决于内核所使用的调度算法,如果要求父子进程相互同步,则要求某种形式的进程间通信。 vfork() 执行次序: fork():对父子进程的调度室由调度器决定的; vfork():是先调用子进程,等子进程的exit(1)被调用后,再调用父进程; 对数据段的影响: fork():父子进程不共享一段地址空间,修改子进程,父进程的内容并不会受影响。 vfork():在子进程调用exit之前,它在父进程的空间中运行,也就是说会更改父进程的数据段、栈和堆。即共享代码区和数据区,且地址和内容都是一样的。 IPC机制(6种) 管道(Pipe)及有名管道(named pipe): 管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信; 信号(Signal): 信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身