摘要:由于觸發器的存在,導致所有數據的都為所以該定時任務運行時需要數據數據做循環處理,服務器妥妥的掛了。。。。觸發器貼上其中條觸發器結尾結尾沒啥好說的啦,此文不是講如何對接調用的,主要講如何分析一個需求,以最優方案解決。
需求
需要把數據庫中所有符合條件的user用戶信息(大概 6W 條信息)都發送至第三方網站 hubspot 上。要求數據有更改或者有新的符合條件的數據,能動態更新至 hubspot (最大可以延遲一天更新最新數據)。
實現 實現一我的想法是:
新建一張hubspot_data表,表里存儲所有要發送的用戶信息。
表中有個字段is_need_send , 0 代表不需要發送至 hubspot ,1 代表需要發送。
先寫一個腳本,把所有的數據到生成至 hubspot_data 表,is_need_send 設置為 1 。
再弄兩個定時任務:
第一個定時任務負責發送hubspot_data表數據至hubspot。
每3分鐘獲取300條is_need_send=1的數據, 通過hubspot提供的api分三次發送 (該API限制為一次最多發送100個用戶)至hubspot 。 發送完之后設置此300條用戶的is_need_send=0.
第二個定時任務負責更新hubspot_data表數據
每天第一次運行時獲取所有符合條件的user用戶信息, 存入到緩存文件中, 后面每次運行則從該緩存腳本中獲取前300條信息, 循環和 hubspot_data 表中的數據對比, 只要有一個字段值不一樣,則更新數據, 如果不存在則插入,最后設置is_need_update=1.
但是這種方式被否決了。
原因在于,6W的總量,每天需要更新的數據量只有600左右,為了這600條用戶的更新,每次腳本運行都要執行大量 sql 來對比數據。也就是說 ,其中 90%的操作都是廢的。
實現二還有種方式:在代碼中找到所有需要發送的用戶信息字段,只要有更改,就手動添加一條語句,來更新 hubspot_data 表數據(或者直接發送)。
但是這種方式被我否決了 。
原因在于這是個維護已超10年的老項目,里面的代碼邏輯異常復雜。誰也不知道哪里就有個地方修改了需要的字段。這個思路的工程量太大~
實現三最后選中了第三個方法:給 hubspot_data 表增加一個為 is_need_update, 0 代表不需要更新數據,1代表需要更新數據。再給涉及到數據數據表加觸發器,表數據有更新插入刪除時,觸發器觸發 hubspot_data 對應表中用戶,更改 is_need_update=1 。上面的第二個定時任務就可以更改為每天運行3次,每次獲取300條is_need_update=1 的數據更新數據,更新之后設置 is_need_update=0 。
第三種方式,開發的代碼量最少,對數據庫的操作也降到了最低。
坑 坑一hubspot 的屬性有個叫 datetime 的類型。這個類型的屬性值,是毫秒級的。這個類型的屬性,只能通過API創建。
還有個叫 Date 的類型,這個類型的屬性,可以在 hubspot 網站上創建,但是他必須是 UTC 時區的凌晨,否則更新數據會失敗。
關于data類型屬性的介紹戳這里。
坑二hubspot 有個 api 可以一次更新多條信息,但是如果這多條信息中,有一條更新失敗,那么該次請求所有的數據都更新失敗。所以必須處理更新失敗的用戶,將失敗用戶 is_need_update 設置為非0非1(以防每次更新數據遇到錯誤用戶信息一直更新失敗又一直更新陷入循環)。
批量更新
原文: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.
最后一個坑:因為我知道每天的更新量大概在600條左右,每天運行3次,大概一次也就更新200數據,所以第二條更新數據的定時任務沒有限定條數 。 正常情況下沒任何問題。直到有一天,,,,,
需要給 users表增加一個字段,設置所有的用戶該字段值為 1 。 由于觸發器的存在,導致 hubspot_data 所有數據的is_need_update都為 1 .所以該定時任務運行時需要 6W 數據數據做循環處理,服務器妥妥的掛了。。。。(服務器只有1G內存)。
觸發器貼上其中2條觸發器
## 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 ;結尾
結尾沒啥好說的啦,此文不是講如何對接、調用 hubspot 的 api ,主要講如何分析一個需求,以最優方案解決。
關于如何對接、調用 hubspot API ,可以閱讀其開發文檔:HubSpot API Overview , 這個 api 文檔網頁,可以直接在上面測試,非常贊的一個功能。
github 上有別人寫好的類庫可以直接拿來用 hubspot 。不過這個使用的 api 都是比較古老的。限于的php 版本,我只能用這個了。最新的 API 的使用,可以參閱其 README.md文件。其中他沒有實現批量更新的 API ,這里給出我自己的一個實現:
在 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); } }
如果開發過程中遇到任何問題,可以到 hubspot開發者社區尋求幫助,支持github賬號登錄哦~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25725.html
摘要:本圖中的數據收集自利用數據集在英偉達上對進行訓練的實際流程。據我所知,人們之前還無法有效利用諸如神威太湖之光的超級計算機完成神經網絡訓練。最終,我們用分鐘完成了的訓練據我們所知,這是使用進行訓練的世界最快紀錄。 圖 1,Google Brain 科學家 Jonathan Hseu 闡述加速神經網絡訓練的重要意義近年來,深度學習的一個瓶頸主要體現在計算上。比如,在一個英偉達的 M40 GPU ...
摘要:采用混合云存儲,災難恢復能夠達到秒級還是分鐘級關鍵還要看帶寬。經測試,采用混合云進行分級存儲,在非實時高可用場景下,存儲成本可降低在使用歸檔存儲的情況下,成本僅為獨立建設災備集群的成本的五分之一。人人都說,混合云/多云是未來。IDC曾預測,2018年,85%以上的大型企業都將采用混合云。RightScale發布的2018年云計算調查報告也顯示出同樣的趨勢,81%的企業都有一個多云策略,其中又...
摘要:正在暑假中的課多周刊第期我們的微信公眾號,更多精彩內容皆在微信公眾號,歡迎關注。若有幫助,請把課多周刊推薦給你的朋友,你的支持是我們最大的動力。原理微信熱更新方案漲知識了,熱更新是以后的標配。 正在暑假中的《課多周刊》(第1期) 我們的微信公眾號:fed-talk,更多精彩內容皆在微信公眾號,歡迎關注。 若有幫助,請把 課多周刊 推薦給你的朋友,你的支持是我們最大的動力。 遠上寒山石徑...
閱讀 1210·2019-08-30 15:55
閱讀 957·2019-08-30 15:55
閱讀 2155·2019-08-30 15:44
閱讀 2889·2019-08-29 14:17
閱讀 1136·2019-08-29 12:45
閱讀 3310·2019-08-26 10:48
閱讀 3136·2019-08-23 18:18
閱讀 2603·2019-08-23 16:47