WebSphere® eXtreme Scale 是 IBM 中间件中一个重要的分布式缓存平台,用以实现弹性的可扩展性和高可用性。">WebSphere eXtreme Scale 以内存网格的方式运行,动态处理、分区、复制和管理成千上万服务器上的应用程序数据和业务逻辑。它提供事务完整性和透明的故障恢复功能以确保高可用性、高可靠性和一致的响应时间。
ObjectMap 是键值对的容器,允许应用程序存储值并以键作为索引。WebSphere eXtreme Scale 能够监控 Map 的 Entry 的插入顺序,从而为 Map 提供了类似队列的 FIFO( 先进先出 ) 的功能。客户端能够按照插入顺序得到 Map 中的 Entry,即使在多线程并发访问的情况下也可以基本保证这种顺序性。
借助于 WebSphere® eXtreme Scale 的高可用性和高可靠性,可以实现弹性的队列负载处理,有效应对大并发的峰值访问和提高消息的可靠性,成为分布式环境下消息队列的一个可靠选择。
Websphere eXtreme Scale FIFO 的实现
有两种实现 WebSphere® eXtreme Scale 先进先出队列的方式,一种是使用原生的 ObjectMap, 一种是使用官方提供的工具包 WXSUtils。下面就两种不同的实现方式进行分别的介绍。
基于 ObjectMap 的 FIFO 实现
WebSphere® eXtreme Scale 记录了 Entry 的插入顺序,我们可以利用此特性来实现先进先出的队列。这种操作必须包含在一个事务中。在指定一个事务中,客户端可以利用 getNextKey(long timeout) 方法获取当前 ObjectMap 里未被锁定的那个 Entry 的 Key,通过这个 Key 来获取当前 Map 中最先被插入的元素。需要注意的是 getNextKey(long timeout) 方法需要设置一个 timeout 时间,单位为毫秒。比如下面代码中我们设定了 5000 毫秒为 timeout 时间,如果超出了 5000 毫秒还没有返回当前未被锁定 Entry 的键值,则返回 Null。此超时时间应该根据实际系统拓扑结构和网络情况进行合理的设置。
清单 1. ObjectMap 的出队
Session sess = grid.getSession(); ObjectMap map = sess.getMap(xxxx); sess.begin(); Object msgKey = map.getNextKey(5000); if (msgKey == null) { sess.rollback(); continue; } Object value = map.get(msgKey); map.remove(msgKey); sess.commit();
需要特别注意的是,如果不从 Map 中删除当前获取的 Entry,那么下次 getNextKey 时仍旧会取得上一次获取的 Key,这样就会造成消息的重复取得。