开发者社区 > 云原生 > 中间件 > 正文

中间件性能初赛关于windows环境下的一些文档汇总

考虑到部分选手用的都是windows电脑,不知道在windows下如何安装RocketMq,不知道如何调试jstorm,我就简单汇总了下学习资料,其实这些资料网上都可以找的到的。
但是有一点,在windows环境下测试,只能跑本地模式。本地模式跑通了,并不一定说在集群模式可以跑过。因为本地模式能测试的功能还是很有局限性的。



RocketMQ(windos环境下)


1.    安装RocketMQ


注:仅支持64位Windows,请安装64位JDK。本文档只是给出了简单的使用方法。
  • 下载编译好的RocketMQ,也可以自行编译:https://github.com/alibaba/RocketMQ/releases
  • 解压缩
  • 运行mqnamesrv.exe,启动name server
  • 设置环境变量set NAMESRV_ADDR=127.0.0.1:9876,随后运行mqbroker.exe启动broker
  • MQ安装完毕

2.    验证MQ是否安装成功
  • 下载初赛的DEMO:
  • git clone https://code.aliyun.com/MiddlewareRace/PreliminaryDemo.git
  • 进入目录,运行mvn install编译DEMO
  • 进入target目录
  • 启动生产者生产数据:java -Drocketmq.namesrv.addr=127.0.0.1:9876 -cp preliminary.demo-1.0-SNAPSHOT.jar com.alibaba.middleware.race.rocketmq.Producer
  • 启动消费者消费数据:java -Drocketmq.namesrv.addr=127.0.0.1:9876 -cp preliminary.demo-1.0-SNAPSHOT.jar com.alibaba.middleware.race.rocketmq.Consumer


JStorm
1.    如何安装JStorm
https://github.com/alibaba/jstorm/wiki/%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85

https://github.com/alibaba/jstorm/wiki/%E5%8D%95Web-UI-%E7%AE%A1%E7%90%86%E5%A4%9A%E9%9B%86%E7%BE%A4


2.    如何提交程序到集群




3.    如何进行本地调试
https://github.com/alibaba/jstorm/wiki/%E5%A6%82%E4%BD%95%E6%9C%AC%E5%9C%B0%E8%B0%83%E8%AF%95-JStorm-%E7%A8%8B%E5%BA%8F




Tair用户使用手册


1.    前提
Tair集群搭建完毕。



2.    使用java客户端


3.    初始化方式

假设tair集群configserver 地址和端口为192.168.1.100:5198,groupname为group_1

初始化方式如下:



4.    接口说明
  • put
ResultCode put(int namespace, Serializable key, Serializable value)
描述:
写入数据,key若存在则强制更新,不过期
参数:
namespace - 申请时分配的namespace
key - key,不超过1k
value - 可序列化对象value,不超过1M。基于性能考虑,建议在10k之内。
返回值:
ResultCode对象。ResultCode.SUCCESS表示写成功,其他表示写失败。其他返回值参见2.4 节常见返回码说明。
另见
ResultCode put(int namespace, Object key, Serializable value, int version),ResultCode put(int namespace, Object key, Serializable value, int version, int expireTime)

  • put
ResultCode put(int namespace, Serializable key, Serializable value, int version)
描述:
写入数据,可用version实现并发处理,不过期
参数:
namespace - 申请时分配的namespace
key - key,不超过1k
value - 可序列化对象value,不超过1M。基于性能考虑,建议在10k之内。
version - 参见 2.3节 特殊参数说明。
返回值
ResultCode对象。ResultCode.SUCCESS表示写成功,其他表示写失败。其他返回值参见2.4 节常见返回码说明。
另见
ResultCode put(int namespace, Object key, Serializable value)
ResultCode put(int namespace, Object key, Serializable value, int version, int expireTime)

  • put
ResultCode put(int namespace, Serializable key, Serializable value, int version, int expireTime)
描述
写入数据,可设置版本号和过期时间
参数:
namespace - 申请时分配的namespace。
key - key,不超过1k
value - 可序列化对象value,不超过1M。基于性能考虑,建议在10k之内。
version参见 2.3节 特殊参数说明。
expireTime – 参见 2.3节 特殊参数说明。
返回值
ResultCode对象。ResultCode.SUCCESS表示写成功,其他表示写失败。其他返回值参见2.4 节常见返回码说明。
另见
ResultCode put(int namespace, Object key, Serializable value),ResultCode put(int namespace, Object key, Serializable value, int version)

  • get
Result<DataEntry> get(int namespace, Serializable key)
描述
读取key相对应的value。
参数
namespace - 申请时分配的namespace。
key - key,不超过1k。
返回值
Result对象,可用isSuccess()方法判断请求是否成功,再用getRc()方法获取到ResultCode。isSuccess有两种情况,ResultCode.SUCCESS表示读成功,ResultCode.DATANOTEXSITS表示数据不存在。其余情况皆表示读取失败。其他返回值参见2.4 节常见返回码说明。

  • delete
ResultCode delete(int namespace, Serializable key)
描述
删除key。
参数:
namespace - 申请时分配的namespace
key - key,不超过1k
返回值
ResultCode对象,ResultCode.SUCCESS表示删除成功。其他返回值参见2.4 节常见返回码说明。



特殊参数说明
  • expiredTime

expiredTime 是指数据的过期时间。一旦超过过期时间,数据将对应用不可见,后端清理策略和应用无关。对应用来说,过期时间始终是精确的。
调用接口时,expiredTime单位是秒。 expireTime <= 0,表示数据永不过期。expireTime > 0,表示设置过期时间。若expireTime>当前时间的时间戳(即Unix时间戳,需转换成距1970-1-1 00:00:00的秒数,比如:2014-01-01 00:00:00,则设置expireTime为1388505600),则表示使用绝对时间,否则使用相对时间。

  • version

version的作用

在Tair的put接口中,有一个version参数,这个参数是为了解决并发更新同一个数据而设置的。
很多情况下,更新数据是先get,修改get回来的数据,然后put回系统。如果有多个客户端get到同一份数据,都对其修改并保存,那么先保存的修改就会被后到达的修改覆盖,从而导致数据丢失问题。在某些情况下,这个是我们不希望发生的。比如客户端A和B取到数据{key, value},A将value修改为value_a,B将value修改为value_b,A先保存,B然后保存,则最终的value为value_b,这时A的修改就不可见了。 version是为了防止这中情况而设置的。
服务器端version初始化为0,当数据第一次put时,version增加为1。后续每次更新数据,服务器端都会将version加1。每次get数据,服务器都会返回当前数据的版本,如果Tair中的数据版本与更新接口中传入的version相同,此次更新才会成功。否则如果在get与更新之间,数据被更新,导致Tair中的version与client传来的version不一致,该次更新会失败,返回ResultCode.VERERROR。version不会无限制增大,当version达到int16的最大值后,会重置为1。
如果应用不关心并发更新的一致性,调用客户端接口时,version必须不传或者传入0。
注意:
1. version的增加是服务器端的行为,tair并不支持多版本数据。另外,更新也是使用put接口。
2. version的值是由服务器端决定的,和client指定的version值无关。


version使用方法
get接口返回的是DataEntry对象,该对象中包含get到的数据的版本号,可以通过getVersion()接口获得该版本号。在put时,将该版本号作为put的参数即可。 如果不考虑版本问题,则可设置version参数为0,系统将强行覆盖数据,即使版本不一致。


如果返回version不一致,怎么办?
如果更新所基于的version和系统中当前的版本不一致,则服务器会返回ResultCode.VERERROR。 这时你可以选择重新get数据,然后在新版本的数据上修改;或者设置version为0重新请求,以达到强制更新的效果。


version具体使用案例
如果应用有10个client会对key进行并发put,那么操作过程如下:
1. get key。如果get key成功,则进入步骤2;如果数据不存在,则进入步骤3.
2. 在调用put的时候将get key返回的verison重新传入put接口。服务端根据version是否匹配来返回client是否put成功。
3. get key数据不存在,则新put数据。此时传入的version必须不是0和1,其他的值都可以(例如10,要保证所有client是一套逻辑)。
不传入0是因为,tair会认为强制覆盖;
不传入1是因为,会出现两个client都写入成功的情况,不能防止并发。假设这样一个场景,client A第一次put key,写入成功,这时服务器端version为1。如果client B设置version为1,服务器端接收到后比较version正确,那么client B也会写成功。这和我们的预期就不一致了。而把version设为其他值时,服务器端接收到后比较version不同,则可以返回version error,client B就写失败了,需要重新get后获取到version值再进行更新。


案例分析:分布式锁
tair中存在该key,则认为该key所代表的锁已被lock;不存在该key,在未加锁。操作过程和上面相似。业务方可以在put的时候增加expire,已避免该锁被长期锁住。


我该不该使用Version?
这取决于用户对数据一致性的要求,如果对数据一致性有较高的要求,并且访问并发高,有很多类似append的操作,那么通过version可以避免数据的意外结果。
当不需要关心并发的时候,不传入或者传入version为0。


什么情况下version会重置为1?
第一次put到tair,或version已经达到int16的最大值。
NOTE:原则上,用户在通过 Get 接口拿到真实 version 之前,『不应该』对 version 的当前值做任何假定。


常见返回码说明




相关链接

http://code.taobao.org/p/tair/wiki/index/?spm=5176.100068.555.2.pb6hnE

展开
收起
玄弟 2016-06-06 15:08:44 14091 0
4 条回答
写回答
取消 提交回答
  • Re中间件性能初赛关于windows环境下的一些文档汇总
    pom里slf4j被依赖排除了,里面添加依赖即可。
    <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
                <version>1.7.2</version>
            </dependency>
    2016-06-30 11:28:09
    赞同 展开评论 打赏
  • 上海市 华东师范大学 软件工程 (非全日制硕士研究生) 网名:Wu_Being,吴兵 代码:!1
    回 2楼hexus的帖子
    我们也遇到这个问题,急需解答!!!谢谢
    2016-06-29 23:57:11
    赞同 展开评论 打赏
  • Re中间件性能初赛关于windows环境下的一些文档汇总

    生产者运行不起来,缺slf4j。
    目前Demo里的依赖有什么问题?
    依赖好多,不敢乱动。
    2016-06-28 11:24:53
    赞同 展开评论 打赏
  • 比赛帮助文档下载地址:
    2016-06-06 15:14:18
    赞同 展开评论 打赏

为企业提供高效、稳定、易扩展的中间件产品。

相关电子书

更多
金融分布式中间件分享 立即下载
无需部署的前端中间件技术——企业移动化新思路 立即下载
《云原生中间件精品案例集》 立即下载