通过位运算转换大小写
位运算是计算机科学领域用的非常广泛的一种计算方式。再合理的使用方式下,会大大提升运算效率,今天就介绍一下位运算的一个巧妙应用:转换大小写字母。
位运算是计算机科学领域用的非常广泛的一种计算方式。再合理的使用方式下,会大大提升运算效率,今天就介绍一下位运算的一个巧妙应用:转换大小写字母。
前一段时间参加了优化一个老的计费系统,学习了一些高并发下做余额扣减的常用手段,也做了一些尝试,因此在这里总结记录一下, 在高并发下对。
在之前的一篇文章通过实际操作理解redis cluster原理中,我们简单介绍过redis cluster的设计原理。redis cluster中的数据是根据一定规则分配到16384个slot中,这些slot又根据配置对应到不同的节点上。我们知道,在集群稳定运行后,仍然可以以slot为单位转移数据,不过对于具体的转移过程,包括转移过程中集群的可用性等问题,一直不是太确定,所以这次详细了解了一下。
从官网下载最新版本,解压,其他的前期准备只需要安装jdk。 从activemq 5.14开始,只支持jdk8。
核心配置文件是conf目录下的activemq.xml, 默认的配置无需修改即可使用,其他配置我们会在后续文章介绍activemq各种特性时详细介绍。
bin目录下运行 activemq start
即可 ,启动之后浏览器打开localhost:8161 可以打开web管理页面。
这里只介绍java下的api使用,activemq默认的openwire协议是只支持java的,因为实现的JMS协议是java下的协议。如果有其他语言的访问需求,可以用stomp,amqp等协议。
引入activemq官方的client包。
1 | <dependency> |
actibemq收发消息的主要步骤类似,都需要先建立连接,然后建立会话,然后再新建需要的producer,consumer.
示例代码如下
1 | public void produce() throws JMSException { |
1 | public void consume() throws JMSException { |
connection,session,consumer都可以创建多个,实现并行消费。一般来说需要使用多connection或者多session,因为只是多consumer的话,共用一个session,只是多个consumer轮流执行而已,不是真正的并行消费。至于connection和session的选择,一般看具体的流量需求。一个connection对应的是一个物理的tcp连接。
producer其实也类似,只是一般并行发消息意义不大,所以就不贴代码了。
activemq提供了一个有用的功能,brower, 作用与consumer类似,只是不会真正将消息消费掉,只是预览消息内容。
1 | public void brower() throws Exception{ |
Activemq是一种消息中间件(MOM),基于JMS协议实现。介绍activemq就不得不介绍消息中间件和jms.
消息中间件是分布式系统十分常见的组件,提供了以比较灵活的方式集成不同应用程序的一种机制,应用程序彼此不直接通信,而是与作为中介的消息中间件进行通信。
消息中间件主要有两个作用,一是解耦,二是平峰,都是大型系统中经常会遇到的问题。
所谓解耦,就是要保持系统内各个应用的相对独立性。例如,用户登录的时候,可能有多个应用要触发各种各样的操作,推荐啊,发消息啊之类的,这些操作跟登录这个操作本身是无关的,如果全都放在登录模块去做,显然不合适,而且用户体验会非常差。这个时候就可以在登陆的时候发一条消息出来,其他系统监听这个消息,再进行各自业务的处理。
平峰,就是为了应对突然的流量增长,毕竟系统分配资源时不可能按最大需求去分配。如果短时间流量太大,可以让消息先留在消息中间件里,业务慢慢处理。
消息中间件一般有两种传递模式:点对点模式(P2P)和发布-订阅模式(Pub/Sub)。
点对点模式在JMS里叫做Queue, 主要特点有三个:
发布-订阅模式则对应JMS里的Topic,与点对点模式向对应,有如下特点:
JMS是Sun定义的一种标准消息传送API。JMS自身并不是一种消息传送系统;它是消息传送客户端和消息传送系统通信时所需接口和类的一个抽象。与JDBC, JNDI等类似。
JMS对消息结构、连接、会话、生产者、消费者等都做了规定。
Activemq就是对JMS1.1的一种具体实现。在后续文章里,我们会对activemq的安装使用以及各种特性进行全面的介绍。