【踩過的坑】[web]1.生產與灰度數據緩存;2.Mysql主從不一樣步;

背景:php作web開發,MVC,phalconphp

1.生產與灰度數據緩存

  • 緣由:mysql

    1. service層獲取數據,有新增數據字段;git

    2. controller層是經過redisCache調用service接口;github

    3. redisCache採用redis-file雙緩存結構,可能存在狀況:redis-cache有效;file-cache有效;直接本地調用service,再寫進redis和file-cache中;web

    4. 線上有個腳本會每隔1秒經過redisCache調用一次此service接口,而且強制刷新緩存(redis-file);redis

    5. 灰度環境和生產環境用的是同一套redis,並且必須這樣;
      因此,這就形成線上的腳本不斷的從線上的service中取得數據,並刷新的redis-file緩存中,從而形成灰度環境直接讀了線上緩存,致使灰度代碼的service變動沒有生效sql

  • 嘗試解決:緩存

    1. 灰度代碼:問題controller調用redisCache接口,有強制刷新參數,將其置爲false;
      存在問題:這樣是恨不正確的作法,會把灰度的service數據強制刷新到redis-file緩存中,從而致使線上緩存出現髒數據,這樣後果很嚴重!!mvc

    2. 灰度代碼:問題controller中,直接調用本地的service,不走緩存;
      存在問題:致使灰度環境的全部(此controller)請求直接打在mysql上,從而增長了mysql自己的風險。測試

(方法一、2,如圖)
solve.png

總結:由於灰度環境在公司內網,訪問量較小,相比方法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底層提供

可參考phalcon-model源碼


總結:1. 永遠不要認爲主從同步;2.同一個mysql鏈接,不要出現既用主庫、又用從庫;

相關文章
相關標籤/搜索