考虑到部分选手用的都是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安装完毕
- 下载初赛的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
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
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集群搭建完毕。
4. 接口说明
假设tair集群configserver 地址和端口为192.168.1.100:5198,groupname为group_1
初始化方式如下:
- 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)
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)
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 节常见返回码说明。
ResultCode delete(int namespace, Serializable key)
描述
删除key。
参数:
namespace - 申请时分配的namespace
key - key,不超过1k
返回值
ResultCode对象,ResultCode.SUCCESS表示删除成功。其他返回值参见2.4 节常见返回码说明。
expiredTime 是指数据的过期时间。一旦超过过期时间,数据将对应用不可见,后端清理策略和应用无关。对应用来说,过期时间始终是精确的。
调用接口时,expiredTime单位是秒。 expireTime <= 0,表示数据永不过期。expireTime > 0,表示设置过期时间。若expireTime>当前时间的时间戳(即Unix时间戳,需转换成距1970-1-1 00:00:00的秒数,比如:2014-01-01 00:00:00,则设置expireTime为1388505600),则表示使用绝对时间,否则使用相对时间。
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 的当前值做任何假定。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。