摘要:由于觸發(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)用 hubspot 的 api ,主要講如何分析一個(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
摘要:本圖中的數(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 ...
摘要:采用混合云存儲(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è)多云策略,其中又...
摘要:正在暑假中的課多周刊第期我們的微信公眾號(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)上寒山石徑...
閱讀 1218·2019-08-30 15:55
閱讀 964·2019-08-30 15:55
閱讀 2164·2019-08-30 15:44
閱讀 2895·2019-08-29 14:17
閱讀 1141·2019-08-29 12:45
閱讀 3317·2019-08-26 10:48
閱讀 3145·2019-08-23 18:18
閱讀 2614·2019-08-23 16:47