的最优方案需要将数据库中所有符合条件的用户信息(约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发送3次到hubspot(该API限制一次最多100个用户)。发送后,设置300个用户的is_need_send=0。第二个定时任务负责在每天第一次运行时更新hubspot_data表中的数据并获取所有符合条件的用户信息,并存储到缓存文件中。从缓存脚本中获取前300条信息,循环比较hubspot_data表中的数据,只要有字段值不同就更新数据,不存在则插入,最后设置is_need_update=1。但是这个方法被拒绝了。原因是,一共6W,每天需要更新的数据量只有600条左右,这600条用户的更新,每次运行脚本都要执行大量的SQL,比较数据。也就是说,90%的操作都是无用的。第二种还有一种实现方式:在代码中找到所有需要发送的用户信息字段,只要有变化,手动添加语句更新hubspot_data表中的数据(或者直接发送).但是这个方法被我拒绝了。原因是这是一个维护了10多年的老项目,里面的代码逻辑极其复杂。没人知道哪里有修改必填字段的地方。这个思路涉及的工作量太大了~实现3最后选择了第三种方法:在hubspot_data表中增加一个is_need_update,0表示不需要更新数据,1表示需要更新数据。然后在数据相关的数据表中添加触发器。当表数据更新、插入、删除时,trigger触发hubspot_data对应表中的user,修改is_need_update=1。上面的第二个定时任务可以改成每天运行3次,每次获取300个数据更新is_need_update=1,更新后设置is_need_update=0。第三种方式,开发的代码量最少,对数据库的操作也降到最低。坑pit-hubspot的属性有个类型叫datetime。该类型的属性值为毫秒级别。这种类型的属性只能通过API创建。还有一种称为日期的类型。此类属性可以在hubspot网站上创建,但必须是UTC时区的凌晨,否则会更新数据失败。单击此处了解数据类型属性的介绍。坑2hubspot有一个api可以一次更新多条信息,但是如果多条信息中有一条信息更新失败,那么本次请求的所有数据都会更新失败。所以必须对更新失败的用户进行处理,失败的用户is_need_update必须设置为非0非1(以防每次更新数据时,用户信息更新失败,更新卡死)在一个循环中)。批量更新原文:使用此端点时,请记住,您的批次中单个联系人的任何错误都会导致整个批次无法处理。如果发生这种情况,我们将返回一个400响应,其中包含有关原因的其他详细信息。第三个坑的最后一个坑:因为我知道每天的更新量是600条左右,每天运行3次,一次只更新200条数据,所以第二次更新数据的定时任务不限制数量项目。通常没有问题。直到有一天,,,,,你需要在users表中增加一个字段,并将所有用户的这个字段的值设置为1。由于trigger的存在,hubspot_data中所有数据的is_need_update都为1,因此定时任务运行时,需要循环处理6W数据,服务器正常挂掉。...(服务器只有1G内存)。触发器贴上其中2条触发器##editupdateUserCIMtrigger(updateuserCIMinfotrigger)DELIMITER;;createtriggerupdateUserCIMafterUPDATEonuser_cim_detailsforeachrowBEGINupdatehubspot_dataSETis_need_update=1whereuser_id=NEW.user_id;END;;DELIMITER;##createinsert_hubspottrigger(插入用户触发器)DROPTRIGGERinsert_hubspot;DELIMITER;;创建触发器insert_hubspotafterINSERTonusersforeachrowBEGINREPLACEintohubspot_data(user_id,email,is_need_update)VALUE(NEW.id,NEW.email,1);END;;DELIMITER;##editUserStatusUpdateDatetrigger(更新用户的状态触发器)DELIMITER;;createtriggerUserStatusUpdateDatebeforeUPDATEonusersforeachrowIFNOT(NEW.user_status<=>OLD.user_status)THENupdatehubspot_datasetis_need_update=CASEwhennew.user_statusin('C','G')then2else1endwhereuser_id=old.id;ENDIF;;DELIMITER;结束尾没啥好的说的啦,这个文不是讲如何对接、调用hubspot的api,主要讲如何去分析一个需求,用最优解来解决。关于如何连接和调用hubspotAPI,可以看它的开发文档:HubSpotAPIOverview,这个api文档网页,可以直接测试,很不错的功能。github上有别人写的库,hubspot可以直接使用。但是,使用的API相对较旧。限于php版本,我只能用这个。最新的API使用方法请参考其README.md文件。其中,他没有实现批量更新API。这是我自己的实现:将以下代码添加到src/Fungku/HubSpot/API/Contacts.php文件中:/***创建一组联系人或更新它们(如果它们已经存在)。**eg:*array(*array('email'=>'testBatch5@qq.com','param'=>array('firstname'=>'JasonT5','lastname'=>'Zhang5','phone'=>'555-122-2325','ispaid'=>'无')),*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')),*)**@paramparams:新联系人的属性和属性值数组,需要email**@returnResponsebodywithJSONobject*用于从HTT创建的联系人PPOST请求**@throwsHubSpotException**/publicfunctionbatch_create_or_update($params){$endpoint='contact/batch/';$属性=数组();foreach($paramsas$k=>$param){$property=array();foreach($param['param']as$key=>$value){array_push($propertie,array("property"=>$key,"value"=>$value));}$properties[$k]['properties']=$properties;如果(!empty($param['vid'])){$properties[$k]['vid']=$param['vid'];}elseif(!empty($param['email'])){$properties[$k]['email']=$param['email'];}否则继续;}$properties=json_encode($properties);尝试{returnjson_decode($this->execute_JSON_post_request($this->get_request_url($endpoint,null),$properties));}catch(HubSpotException$e){thrownewHubSpotException('无法创建联系人:'.$e);}}如果在开发过程中遇到任何问题,可以到hubspot开发者社区寻求帮助,支持使用你的github账号登录~
