无人机与农业相辅相成
|
在mysql应用中,最让人揪心的就是同步延迟问题,原因是多方面的,但带来的负面影响非常大,甚至都无法解释。 mysql作为最流行的关系型数据库之一,它的强项可能并不是速度,并行复制能力也并不强,所以如果你要重度依赖mysql,那么必须意识到同步延迟可能是常态。 那么如何尽量去避免呢? 1:应用解决方案 在开发中,假设延迟是存在的,对于核心业务必须要严谨,比如说文章队列,如果获取不到从库文章信息,是不是再一次投递队列,或者从主库查询,尽量减少延迟带来的影响,当然设计的复杂度就增加了。 如果你重度依赖缓存,那么如何避免缓存信息是脏的,这更难解决。 2:减负 mysql无法是增删改查,要保持数据量可控,我最喜欢在不影响应用的前提下删除数据,看似很low的解决方案其实很管用。 尽量减少慢查询,以前同步延迟都是查询带来的,但这次却不是,而是队列大量更新和插入带来的,比如说每天全量推送用户,长时间高并发写,同步不可避免,所以一定要控制并发写入和更新量。 3:选择合适的解决方案 mysql尽量作为存储使用,因为大规模的查询和更新并不是它的优势,所以非核心业务,可以考虑redis和mongodb,尤其是队列解决方案,不建议使用mysql,或者说有多套解决方案。 4:拆分 受限于mysql本身机制,可以通过升级mysql版本,提升并行复制能力。或者根据不同的场景,使用多个库,甚至多个mysql实例,避免核心服务受影响。 一方面服务能够解耦,另外也方便扩展。这也是分而治之的解决思路之一。 5:负载均衡 有的时候发现某些从库不延迟,就一台延迟,可以通过策略,摘除这台从库,但必须意识到,这只是临时解决方案,出现大量的延迟,说明问题可能已经比较严重了。
目前规模还小,如果大了呢?那时候可能是灾难性的。 这段程序的输出与上面中完全相同,其实两者在实际执行中的区别也不大,虽然前者调用了submit(Callable task)而后者调用了submit(Runnable task),但最终都通过execute(futuretask)来把任务加入线程池中。 总结 上面大费周章其实只是尽可能细致地讲清楚了 Callable 中的任务是如何执行的,总结起来就是: 线程池中,submit() 方法实际上将 Callable 封装在 FutureTask 中,将其作为 Runnable 的子类传给 execute()真正执行; FutureTask 在 run() 中调用 Callable 对象的 call() 方法并接收返回值或捕获异常保存在Object outcome中,同时管理执行过程中的状态state; FutureTask 同时作为 Future 的子类,通过 get() 返回任务的执行结果,若未执行完成则通过等待队列进行阻塞等待完成;
FutureTask 作为一个 Runnable 的 Future,其中最重要的两个方法如下。 (编辑:四平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
