国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

最優(yōu)方案實(shí)現(xiàn)同步數(shù)據(jù)至HUBSPOT

SimpleTriangle / 3315人閱讀

摘要:由于觸發(fā)器的存在,導(dǎo)致所有數(shù)據(jù)的都為所以該定時(shí)任務(wù)運(yùn)行時(shí)需要數(shù)據(jù)數(shù)據(jù)做循環(huán)處理,服務(wù)器妥妥的掛了。。。。觸發(fā)器貼上其中條觸發(fā)器結(jié)尾結(jié)尾沒(méi)啥好說(shuō)的啦,此文不是講如何對(duì)接調(diào)用的,主要講如何分析一個(gè)需求,以最優(yōu)方案解決。

需求

需要把數(shù)據(jù)庫(kù)中所有符合條件的user用戶信息(大概 6W 條信息)都發(fā)送至第三方網(wǎng)站 hubspot 上。要求數(shù)據(jù)有更改或者有新的符合條件的數(shù)據(jù),能動(dòng)態(tài)更新至 hubspot (最大可以延遲一天更新最新數(shù)據(jù))。

實(shí)現(xiàn) 實(shí)現(xiàn)一

我的想法是:

新建一張hubspot_data表,表里存儲(chǔ)所有要發(fā)送的用戶信息。

表中有個(gè)字段is_need_send , 0 代表不需要發(fā)送至 hubspot ,1 代表需要發(fā)送。

先寫(xiě)一個(gè)腳本,把所有的數(shù)據(jù)到生成至 hubspot_data 表,is_need_send 設(shè)置為 1 。

再弄兩個(gè)定時(shí)任務(wù):

第一個(gè)定時(shí)任務(wù)負(fù)責(zé)發(fā)送hubspot_data表數(shù)據(jù)至hubspot。

每3分鐘獲取300條is_need_send=1的數(shù)據(jù),
通過(guò)hubspot提供的api分三次發(fā)送
(該API限制為一次最多發(fā)送100個(gè)用戶)至hubspot 。 
發(fā)送完之后設(shè)置此300條用戶的is_need_send=0.

第二個(gè)定時(shí)任務(wù)負(fù)責(zé)更新hubspot_data表數(shù)據(jù)

每天第一次運(yùn)行時(shí)獲取所有符合條件的user用戶信息,
存入到緩存文件中,
后面每次運(yùn)行則從該緩存腳本中獲取前300條信息,
循環(huán)和 hubspot_data 表中的數(shù)據(jù)對(duì)比,
只要有一個(gè)字段值不一樣,則更新數(shù)據(jù),
如果不存在則插入,最后設(shè)置is_need_update=1.

但是這種方式被否決了。

原因在于,6W的總量,每天需要更新的數(shù)據(jù)量只有600左右,為了這600條用戶的更新,每次腳本運(yùn)行都要執(zhí)行大量 sql 來(lái)對(duì)比數(shù)據(jù)。也就是說(shuō) ,其中 90%的操作都是廢的。

實(shí)現(xiàn)二

還有種方式:在代碼中找到所有需要發(fā)送的用戶信息字段,只要有更改,就手動(dòng)添加一條語(yǔ)句,來(lái)更新 hubspot_data 表數(shù)據(jù)(或者直接發(fā)送)。

但是這種方式被我否決了 。

原因在于這是個(gè)維護(hù)已超10年的老項(xiàng)目,里面的代碼邏輯異常復(fù)雜。誰(shuí)也不知道哪里就有個(gè)地方修改了需要的字段。這個(gè)思路的工程量太大~

實(shí)現(xiàn)三

最后選中了第三個(gè)方法:給 hubspot_data 表增加一個(gè)為 is_need_update, 0 代表不需要更新數(shù)據(jù),1代表需要更新數(shù)據(jù)。再給涉及到數(shù)據(jù)數(shù)據(jù)表加觸發(fā)器,表數(shù)據(jù)有更新插入刪除時(shí),觸發(fā)器觸發(fā) hubspot_data 對(duì)應(yīng)表中用戶,更改 is_need_update=1 。上面的第二個(gè)定時(shí)任務(wù)就可以更改為每天運(yùn)行3次,每次獲取300條is_need_update=1 的數(shù)據(jù)更新數(shù)據(jù),更新之后設(shè)置 is_need_update=0 。

第三種方式,開(kāi)發(fā)的代碼量最少,對(duì)數(shù)據(jù)庫(kù)的操作也降到了最低。

坑一

hubspot 的屬性有個(gè)叫 datetime 的類(lèi)型。這個(gè)類(lèi)型的屬性值,是毫秒級(jí)的。這個(gè)類(lèi)型的屬性,只能通過(guò)API創(chuàng)建。
還有個(gè)叫 Date 的類(lèi)型,這個(gè)類(lèi)型的屬性,可以在 hubspot 網(wǎng)站上創(chuàng)建,但是他必須是 UTC 時(shí)區(qū)的凌晨,否則更新數(shù)據(jù)會(huì)失敗。

關(guān)于data類(lèi)型屬性的介紹戳這里。

坑二

hubspot 有個(gè) api 可以一次更新多條信息,但是如果這多條信息中,有一條更新失敗,那么該次請(qǐng)求所有的數(shù)據(jù)都更新失敗。所以必須處理更新失敗的用戶,將失敗用戶 is_need_update 設(shè)置為非0非1(以防每次更新數(shù)據(jù)遇到錯(cuò)誤用戶信息一直更新失敗又一直更新陷入循環(huán))。

批量更新
原文:When using this endpoint, please keep in mind that any errors with a single contact in your batch will prevent the entire batch from processing. If this happens, we"ll return a 400 response with additional details as to the cause.

坑三

最后一個(gè)坑:因?yàn)槲抑烂刻斓母铝看蟾旁?00條左右,每天運(yùn)行3次,大概一次也就更新200數(shù)據(jù),所以第二條更新數(shù)據(jù)的定時(shí)任務(wù)沒(méi)有限定條數(shù) 。 正常情況下沒(méi)任何問(wèn)題。直到有一天,,,,,

需要給 users表增加一個(gè)字段,設(shè)置所有的用戶該字段值為 1 。 由于觸發(fā)器的存在,導(dǎo)致 hubspot_data 所有數(shù)據(jù)的is_need_update都為 1 .所以該定時(shí)任務(wù)運(yùn)行時(shí)需要 6W 數(shù)據(jù)數(shù)據(jù)做循環(huán)處理,服務(wù)器妥妥的掛了。。。。(服務(wù)器只有1G內(nèi)存)。

觸發(fā)器

貼上其中2條觸發(fā)器

## edit updateUserCIM trigger(update user CIM info trigger)
DELIMITER ;;
create trigger updateUserCIM
             after UPDATE on user_cim_details
             for each row
BEGIN
  update hubspot_data SET is_need_update = 1 where user_id = NEW.user_id;
END;;
DELIMITER ;
## create insert_hubspot trigger( insert user trigger)
DROP TRIGGER insert_hubspot;
DELIMITER ;;
create trigger insert_hubspot
             after INSERT on users
             for each row
BEGIN
  REPLACE into hubspot_data(user_id, email,is_need_update) VALUE (NEW.id,NEW.email,1);
END;;
DELIMITER ;
## edit UserStatusUpdateDate trigger(update user"s status trigger)
DELIMITER ;;
create trigger UserStatusUpdateDate
     before UPDATE on users
     for each row
IF NOT(NEW.user_status <=> OLD.user_status) THEN
update hubspot_data
    set is_need_update = CASE
    when new.user_status in ("C","G") then 2 else 1
    end
where user_id = old.id;
END IF;;
DELIMITER ;
結(jié)尾

結(jié)尾沒(méi)啥好說(shuō)的啦,此文不是講如何對(duì)接、調(diào)用 hubspotapi ,主要講如何分析一個(gè)需求,以最優(yōu)方案解決。

關(guān)于如何對(duì)接、調(diào)用 hubspot API ,可以閱讀其開(kāi)發(fā)文檔:HubSpot API Overview , 這個(gè) api 文檔網(wǎng)頁(yè),可以直接在上面測(cè)試,非常贊的一個(gè)功能。

github 上有別人寫(xiě)好的類(lèi)庫(kù)可以直接拿來(lái)用 hubspot 。不過(guò)這個(gè)使用的 api 都是比較古老的。限于的php 版本,我只能用這個(gè)了。最新的 API 的使用,可以參閱其 README.md文件。其中他沒(méi)有實(shí)現(xiàn)批量更新的 API ,這里給出我自己的一個(gè)實(shí)現(xiàn):

src/Fungku/HubSpot/API/Contacts.php文件加入以下代碼:

/**
 * Create a group of contacts or update them if they already exist.
 *
 * eg:
 * array(
 * array("email"=>"testBatch5@qq.com","param"=>array("firstname"=>"JasonT5","lastname"=>"Zhang5","phone"=>"555-122-2325","ispaid"=>"No")),
 * array("email"=>"testBatch6@qq.com","param"=>array("firstname"=>"JasonT6","lastname"=>"Zhang6","phone"=>"555-122-2326","ispaid"=>"No")),
 * array("email"=>"testBatch7@qq.com","param"=>array("firstname"=>"JasonT7","lastname"=>"Zhang7","phone"=>"555-122-2327","ispaid"=>"No")),
 * array("email"=>"testBatch8@qq.com","param"=>array("firstname"=>"JasonT8","lastname"=>"Zhang8","phone"=>"555-122-2328","ispaid"=>"No")),
 * )
 *
 * @param params: array of properties and property values for new contact, email is required
 *
 * @return Response body with JSON object
 * for created Contact from HTTP POST request
 *
 * @throws HubSpotException
 **/
public function batch_create_or_update($params){
    $endpoint = "contact/batch/";
    $properties = array();
    foreach ($params as $k => $param) {
        $propertie = array();
        foreach ($param["param"] as $key => $value){
            array_push($propertie, array("property"=>$key,"value"=>$value));
        }
        $properties[$k]["properties"] = $propertie;
        if(!empty($param["vid"])){
            $properties[$k]["vid"] = $param["vid"];
        }elseif (!empty($param["email"])){
            $properties[$k]["email"] = $param["email"];
        }else
            continue;
    }
    $properties = json_encode($properties);
    try{
        return json_decode($this->execute_JSON_post_request($this->get_request_url($endpoint,null),$properties));
    } catch (HubSpotException $e) {
        throw new HubSpotException("Unable to create contact: " . $e);
    }
}

如果開(kāi)發(fā)過(guò)程中遇到任何問(wèn)題,可以到 hubspot開(kāi)發(fā)者社區(qū)尋求幫助,支持github賬號(hào)登錄哦~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/25725.html

相關(guān)文章

  • 24分鐘完成ImageNet訓(xùn)練,刷新世界紀(jì)錄

    摘要:本圖中的數(shù)據(jù)收集自利用數(shù)據(jù)集在英偉達(dá)上對(duì)進(jìn)行訓(xùn)練的實(shí)際流程。據(jù)我所知,人們之前還無(wú)法有效利用諸如神威太湖之光的超級(jí)計(jì)算機(jī)完成神經(jīng)網(wǎng)絡(luò)訓(xùn)練。最終,我們用分鐘完成了的訓(xùn)練據(jù)我們所知,這是使用進(jìn)行訓(xùn)練的世界最快紀(jì)錄。 圖 1,Google Brain 科學(xué)家 Jonathan Hseu 闡述加速神經(jīng)網(wǎng)絡(luò)訓(xùn)練的重要意義近年來(lái),深度學(xué)習(xí)的一個(gè)瓶頸主要體現(xiàn)在計(jì)算上。比如,在一個(gè)英偉達(dá)的 M40 GPU ...

    Soarkey 評(píng)論0 收藏0
  • 混合云存儲(chǔ),備份、歸檔、容災(zāi)一個(gè)也不能少

    摘要:采用混合云存儲(chǔ),災(zāi)難恢復(fù)能夠達(dá)到秒級(jí)還是分鐘級(jí)關(guān)鍵還要看帶寬。經(jīng)測(cè)試,采用混合云進(jìn)行分級(jí)存儲(chǔ),在非實(shí)時(shí)高可用場(chǎng)景下,存儲(chǔ)成本可降低在使用歸檔存儲(chǔ)的情況下,成本僅為獨(dú)立建設(shè)災(zāi)備集群的成本的五分之一。人人都說(shuō),混合云/多云是未來(lái)。IDC曾預(yù)測(cè),2018年,85%以上的大型企業(yè)都將采用混合云。RightScale發(fā)布的2018年云計(jì)算調(diào)查報(bào)告也顯示出同樣的趨勢(shì),81%的企業(yè)都有一個(gè)多云策略,其中又...

    zoomdong 評(píng)論0 收藏0
  • 正在暑假中的《課多周刊》(第1期)

    摘要:正在暑假中的課多周刊第期我們的微信公眾號(hào),更多精彩內(nèi)容皆在微信公眾號(hào),歡迎關(guān)注。若有幫助,請(qǐng)把課多周刊推薦給你的朋友,你的支持是我們最大的動(dòng)力。原理微信熱更新方案漲知識(shí)了,熱更新是以后的標(biāo)配。 正在暑假中的《課多周刊》(第1期) 我們的微信公眾號(hào):fed-talk,更多精彩內(nèi)容皆在微信公眾號(hào),歡迎關(guān)注。 若有幫助,請(qǐng)把 課多周刊 推薦給你的朋友,你的支持是我們最大的動(dòng)力。 遠(yuǎn)上寒山石徑...

    liukai90 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

SimpleTriangle

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<