博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【踩过的坑】[web]1.生产与灰度数据缓存;2.Mysql主从不同步;
阅读量:5768 次
发布时间:2019-06-18

本文共 1778 字,大约阅读时间需要 5 分钟。

hot3.png

https://segmentfault.com/a/1190000006805840

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

1.生产与灰度数据缓存

  • 原因:

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

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

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

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

    5. 灰度环境和生产环境用的是同一套redis,而且必须这样;

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

  • 尝试解决:

    1. 灰度代码:问题controller调用redisCache接口,有强制刷新参数,将其置为false;

      存在问题:这样是恨不正确的做法,会把灰度的service数据强制刷新到redis-file缓存中,从而导致线上缓存出现脏数据,这样后果很严重!!

    2. 灰度代码:问题controller中,直接调用本地的service,不走缓存;

      存在问题:导致灰度环境的所有(此controller)请求直接打在mysql上,从而增加了mysql本身的风险。

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

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

2.Mysql主从不同步

  • 原因:

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

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

    3. 更新通过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底层提供

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

转载于:https://my.oschina.net/u/1762916/blog/1527295

你可能感兴趣的文章
objective-c内存管理基础
查看>>
sap关于价值串的说法(转载)
查看>>
Migration to S/4HANA
查看>>
sed 对目录进行操作
查看>>
什么是代码
查看>>
移动端开发单位——rem,动态使用
查看>>
系列文章目录
查看>>
手把手教你如何提高神经网络的性能
查看>>
前端布局原理涉及到的相关概念总结
查看>>
递归调用 VS 循环调用
查看>>
使用sstream读取字符串中的数字(c++)
查看>>
树莓派下实现ngrok自启动
查看>>
javascript静态类型检测工具—Flow
查看>>
MachineLearning-Sklearn——环境搭建
查看>>
node学习之路(二)—— Node.js 连接 MongoDB
查看>>
Goroutine是如何工作的?
查看>>
《深入理解java虚拟机》学习笔记系列——垃圾收集器&内存分配策略
查看>>
TriggerMesh开源用于多云环境的Knative Event Sources
查看>>
GitLab联合DigitalOcean为开源社区提供GitLab CI免费托管
查看>>
通过XAML Islands使Windows桌面应用程序现代化
查看>>