Chen Jian's Java Blog 

Library dependency V.S. Remote API dependency in SOA

by Chen Jian


Posted on 2016-10-05 12:00 in Architecture


Pros of Library Dependency: Simplicity in terms of implementation . In java, all you need is Maven. There is no need for any RPC serialiser or RPC middleware.  Simplicity in terms of deployment . You will need less...


Layering in Java Webapps - My Final Version

by Chen Jian


Posted on 2016-01-21 12:00 in Architecture


What a good layering solution should do It must handle the following problems: 1. Dividing a system into layers based on modularization principles, such as single-direction dependency, limited entry of components and so on.  2....


How to signify the end of a self-defined message in TCP programming?

by Chen Jian


Posted on 2015-11-05 12:00 in Architecture


TPC's data transfer is based on stream. If the two sides don't agree on how to detect the end of self-defined message, the receiver won't know the boundary of a message.  A simple way is to have a special character is the ending flag, such as...


Tips about writing a scraper

by Chen Jian


Posted on 2015-03-01 12:00 in Architecture


Workflow Model:  Download All Pages Before Parsing Them Website scraping is a batch work. Basically there are two workflow models in this job.  One is: download page1 => parse page1 and save records of page1 =>  download page2 =>...


集群环境下慎用本地缓存

by Chen Jian


Posted on 2014-11-10 12:00 in Architecture


集群环境下慎用本地缓存。 用户1在机器A上看到100条记录,用户2在机器B上看到的却是90条记录。 你会说你的业务允许两边看到不一样。 是的,两个用户看到的不一样不要紧。 但是同一个用户看到不一样的话,用户体验会非常差,差到要骂人。 例子是:用户1在机器A上提交表单删除100条记录,服务端处理完毕后让浏览器跳转(Redirect after Submission),负载均衡将这个请求跳转到机器B上,机器B上的本地缓存没变,所以仍然是删除前的记录数。 ...


一个通用的系统监控工具:Zabbit

by Chen Jian


Posted on 2014-10-25 12:00 in Architecture


一个通用的系统监控工具:Zabbit. 收藏一下。


基于比较的分页机制 V.S. 页码式分页

by Chen Jian


Posted on 2014-09-20 12:00 in Architecture


基于比较的分页机制 中,输入是一个被比较值。 页码式分页机制中,输入则是页码。 用户体验 对于数据不断增长的功能,页码式分页机制在用户体验方面有个缺点:你翻到下一页时可能会看到刚刚已经看到过的记录。 以贴吧为例,你进到第一页时,你看到的是06,05,04这三条记录;翻到第二页时,本应看到的是03、02、01。 然而在你翻页之前,另一个用户插进了记录07记录; 这时再看第二页时,系统认为此时第一页是07、06、05,于是把第二页04、03、02返回给你,而你刚刚已经看了记录04. ...


开发A/B测试功能的注意事项

by Chen Jian


Posted on 2014-07-14 12:00 in Architecture


有一些注意事项: 1. 用户所见的一致性: 张三始终看到的是A版本,李四始终看到的是B版本,否则用户会很疑惑,甚至感到被玩弄感情。关于一致性还要考虑一些边界情况:     a. 一个匿名用户在同一台机器上操作多次,应该看到同一个版本     b. 一个匿名用户看到A版本以后,再注册,仍然应该看到A版本 2. 系统应该有一个后门,随心所欲地在A/B间互切,以方便在测试阶段进行测试。 3....


统计值在持久化前做一下校验:不能在值域之外

by Chen Jian


Posted on 2014-05-10 12:00 in Architecture


由于并发、程序bug或其他原因,你的统计值或多或少可能不那么准确。 如果说不准确可以勉强接受,超住值域之外就属于丢脸了。 如果你的页面上显示一个人发过的帖子数为-1 , 那就贻笑大方了。如果是0。即使不精确,也还说的过去。 所以,在持久化任何统计值之前,先把这个值正规化为值域的边界值(比如,小于0则置成0)。


影响业务逻辑的标签、徽章应该由开发人员创建

by Chen Jian


Posted on 2014-05-10 12:00 in Architecture


社区系统里的各种标签、徽章应该由谁创建,由谁来贴标签、颁发徽章? 贴标签、颁发徽章当然要由运营操作人员来做。 谁来创建呢?如果这个标签仅仅用来显示,而不会扭曲任何if/else逻辑,那可以由操作人员在后台界面上完成。 否则,就应该由开发人员创建,因为代码里要用它。如果还没创建好,怎么用它? 一般情况下,可以仅仅作为枚举类写死在代码里,连数据库表都不用建。


通过异步机制解耦主干流程和附加流程

by Chen Jian


Posted on 2014-05-09 12:00 in Architecture


在web2.0系统中,用户的一次写操作,可能不仅仅意味着系统里要新增一条相应的记录,系统里可能还有很多统计性的事情要做。 比如在社区系统中,一个用户发了一个帖子,系统除了生成这个帖子的记录之外,还要给用户的发贴数加1,用户使用过的tag数加1,每个tag对应的帖子数加1 。。。 可以把主流程(生成帖子记录)和附加流程(各种加1)整合在一个事务里执行,程序健壮且易理解。但也可以在完成主流程后,发一条消息出去,让消息的消费者完成这些统计操作。 这种 异步机制...


"手动干预排序"的设计与实现

by Chen Jian


Posted on 2014-05-09 12:00 in Architecture


你的记录一般会按某个业务字段排序,比如ID,生成时间等等。 在论坛或SNS系统中,你可能要允许手工调整记录间的排序,比如“置顶一个帖子”,“下沉某个帖子让人感觉它是一个月前发表的”等等。 在设计社区系统的数据库时,你首先要有意识地考虑下某个记录列表是否需要手工排序。如果需要,你应该使用一个专门的字段来解决这个问题。 ============================= 下面就说下这个字段(假设它叫 sort_order)相关的设计与实现: 1. 考虑到...


如果你的系统既有web界面,又要暴露remote api,应该怎么分层?

by Chen Jian


Posted on 2014-05-08 12:00 in Architecture


如果你的系统既有web界面,又要暴露remote api,应该怎么分层? 我的回答是: 1. 如果web操作为主,remote api是少数,那就用最常见的web-biz模式;web层不必那么薄,可以通过组装biz services实现use cases 2. 如果remote api为主,web操作为辅,则应该用web-app-biz模式,并且web层不准直调biz层 。 ===========================================...


小技巧:从多个数据源中取出前10条记录

by Chen Jian


Posted on 2014-05-07 12:00 in Architecture


考虑这样的场景:论坛里有个页面,混合展示所有的精华贴和热门贴; 帖子按ID逆序排列,并且要有分页。 怎么写出一个符合这种要求的SQL? 受限于你的数据库设计和性能约束,这样的SQL可能很难写。 有种办法是:先取出10条精华贴,再取出10条热门贴,然后再在内存里按ID逆序排列并去重,最后返回前10条。 这样做不需要做复杂的SQL查询,性能也能接受。不过,这种模式只适于 比较式分页 (ID小于某个值的前10个帖子),不适应于普通的页码式分页(第N页)。 ...


消息中间件可能重发消息,怎么办?

by Chen Jian


Posted on 2013-12-14 12:00 in Architecture


消息中间件可能重发消息,怎么办?只能要求客户端保证幂等性了。 但这又增加了客户端的复杂性,人家可能不愿意。 其实解决办法很简单(也很流氓),你自己做个客户端SDK,在这里面做好消息去重,然后让你的客户集成它就是了。