资讯专栏INFORMATION COLUMN

【踩过的坑】[web]1.生产与灰度数据缓存;2.Mysql主从不同步;

sixgo / 3095人阅读

摘要:方法,如图总结因为灰度环境在公司内网,访问量较小,相比方法,方法可以暂时解决灰度测试时的缓存问题。但是仍然存在风险。

背景:php做web开发,MVC,phalcon

1.生产与灰度数据缓存

原因:

service层获取数据,有新增数据字段;

controller层是通过redisCache调用service接口;

redisCache采用redis-file双缓存结构,可能存在情况:redis-cache有效;file-cache有效;直接本地调用service,再写进redis和file-cache中;

线上有个脚本会每隔1秒通过redisCache调用一次此service接口,并且强制刷新缓存(redis-file);

灰度环境和生产环境用的是同一套redis,而且必须这样;
所以,这就造成线上的脚本不断的从线上的service中取得数据,并刷新的redis-file缓存中,从而造成灰度环境直接读了线上缓存,导致灰度代码的service变更没有生效

尝试解决:

灰度代码:问题controller调用redisCache接口,有强制刷新参数,将其置为false;
存在问题:这样是恨不正确的做法,会把灰度的service数据强制刷新到redis-file缓存中,从而导致线上缓存出现脏数据,这样后果很严重!!

灰度代码:问题controller中,直接调用本地的service,不走缓存;
存在问题:导致灰度环境的所有(此controller)请求直接打在mysql上,从而增加了mysql本身的风险。

(方法1、2,如图)

总结:因为灰度环境在公司内网,访问量较小,相比方法1,方法2可以暂时解决灰度测试时的缓存问题。但是仍然存在风险。

(各位看官,有木有更好的解决方案?)

2.Mysql主从不同步

原因:

环境:php+mysql+phalcon,生产环境,mysql存在主从;

通过接口传入A、B两组数据并在一个事务中分别插入到A-table、B-table中,提交事务,再更新A刚插入的一个字段;

更新通过phalcon的findFrist找到数据 刚才插入的数据,更新字段,调用save;

    // 示例代码 ATable,BTable都是继承phalcon的model
    $a = array("id" => 1, "testa" => "data");
    $b = array("id" => 1, "testb" => "data");
    
    // 插入数据
    $db->startTrascation();
    $a_obj = new ATable();
    $a_obj->id      = $a["id"];
    $a_obj->testa = $a["testa"];
    $a_obj->save();
    $b_obj = new BTable();
    $b_obj->id      = $b["id"];
    $b_obj->testb = $b["testb"];
    $b_obj->save();
    $db->commit();

    // 更新数据,findFirst
    $update_a_obj = ATable::findFirst(array("id=:a_id:", "bind" => array("id" => $a["id"])));
    $update_a_obj->testa = "new_data";
    $update_a_obj->save();
    // 这里就会出错,因为这里findFirst走了从库

    // -----------------说明----------------------
    // findFirst走从库是项目本身在model层做的初始化
    public function initialize() {
        parent::initialize();
        $this->setReadConnectionService("db_r");
        $this->setWriteConnectionService("db");
    }
    // setReadConnectionService由phalcon底层提供

可参考phalcon-model源码


总结:1. 永远不要认为主从同步;2.同一个mysql连接,不要出现既用主库、又用从库;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30396.html

相关文章

  • 【腾讯云峰会 Cloud Native 专场】微票儿的 Cloud Native 实践之路

    摘要:导读在今年腾讯云峰会上,开源技术同样是一大亮点。此文是微票时代技术副总裁杨森淼在现场有关微票儿的实践之路分享的实录。 导读 在今年腾讯云峰会上,开源技术同样是一大亮点。作为开源技术的集成平台,Cloud Native 专场给各家提供了针对 OpenStack 应用以及背后填坑之路作深度探讨的机会。此文是微票时代技术副总裁杨森淼在现场有关《微票儿的 Cloud Native 实践之路》分...

    mo0n1andin 评论0 收藏0
  • 【腾讯云峰会 Cloud Native 专场】微票儿的 Cloud Native 实践之路

    摘要:导读在今年腾讯云峰会上,开源技术同样是一大亮点。此文是微票时代技术副总裁杨森淼在现场有关微票儿的实践之路分享的实录。 导读 在今年腾讯云峰会上,开源技术同样是一大亮点。作为开源技术的集成平台,Cloud Native 专场给各家提供了针对 OpenStack 应用以及背后填坑之路作深度探讨的机会。此文是微票时代技术副总裁杨森淼在现场有关《微票儿的 Cloud Native 实践之路》分...

    paulli3 评论0 收藏0
  • Maven踩过的坑

    摘要:采用了一种被称之为概念来管理项目,所有的项目配置信息都被定义在一个叫做的文件中,通过该文件,可以管理项目的整个声明周期,包括编译,构建,测试,发布,报告等等。目前下绝大多数项目都已经采用进行管理。 前言:对于微软技术死忠的笔者来说,学习JAVA灵活又复杂的技术是件多么痛苦的事,开始想念我大微软简单的开发环境搭建以及完整详尽的开发文档,还有那一看就懂的案例教程了...可是为了工作,依旧不...

    cgspine 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<