做支付、订单相关功能时的注意点

不确定的一定要采取保守策略,不可以直接设置最终态。

  1. 调用第三方支付接口时,若出现网络异常,则记为「处理中」,而不是「处理失败」;
  2. 查询订单失败时,不能作为「交易失败」;
  3. 使用第三方服务时,确保「幂等」下才可重试;(如流水号可以确保幂等时,可以通过流水号不变来重试)
  4. 较短时间内查询第三方订单不存在或失败时,不能想当然认为订单失败,可能是第三方还没处理结束,要延长处理频次或人为干预,确保自己系统的健壮性;
  5. 后端防重时,可以采用有限状态机模式(数据库乐观锁+白名单);
  6. 状态尽量是单向流转(如已完成的订单,不可再变更为处理中)。

简言之,不确定的一定要采取保守策略,不可以直接设置最终态。

Mysql使用虚拟列建索引提升查询性能

使用虚拟列绕过最左匹配,减少查询行数,提升性能

假设有一张t_people表,有组合索引(name, age),若name是「李」开头的有许多,则以下查询依然会很慢:

select * from t_people where name like '李%' and age = 8;

解决方法:可以创建一个「虚拟列」(Mysql 5.7+版本支持)name_first,存储name的第一个字,并使用此虚拟列建组合索引:

alter table t_people add name_first varchar(2) generated always as (left(name, 1)), add index(name_first, age);

修改后的查询语句:

select * from t_people where name_first = '李' and age = 8;

Laravel中Chunk使用注意事项

在数据集较大时,使用chunk分块处理可以防止内存溢出,但若更新内容跟分块依赖字段一致,则会出现更新不完整现象。

简单描述原因:chunk内部机制会对依赖字段分页查询,但每处理过一个数据块,数据集会重新拉取,但此时分页的页码却在正常递增,此时会出现部分数据取不到现象。

详细参考:https://segmentfault.com/a/1190000015284897

mqtt

mqtt实现多客户端实时通信,如平台推送消息至移动应用终端。

MQTT 它是 IBM 公司 开发的一个即时通讯协议,也是一个物联网传输协议,它被设计用于轻量级的发布/订阅式的消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。它针对低带宽网络,低计算能力的设备,做了特殊的优化,使得其能适应各种物联网应用场景,其实现在很多的第三方推送平台也是基于 MQTT 实现的。

摘自:https://cloud.tencent.com/developer/news/223471

Centos上搭建服务:

centos安装Mosquitto

应用:

python+mqtt实现推送

其他参考:

  1. https://www.ibm.com/developerworks/cn/iot/iot-mqtt-why-good-for-iot/index.html
  2. 物联网入门:搭建MQTT服务器

Laravel之分页

  1. 获取数据集时使用paginate()方法。
  2. 视图文件中加载显示分页链接。

示例代码参考:

效果图:

Laravel中使用excel导入导出

使用composer安装库:composer require maatwebsite/excel

项目地址:https://github.com/Maatwebsite/Laravel-Excel

导入:

  1. 创建Import对象:php artisan make:import UsersImport
  2. 将导入的excel内容解析成数组:$excelContent = Excel::toArray(new UsersImport, $request->file('user_file'));

导出:

  1. 创建Export对象:php artisan make:export UsersExport
  2. 修改collection()方法,返回要导出的数据return collect($exportArrayData);
  3. 保存导出的excel文件:

【参考:https://docs.laravel-excel.com/3.1/exports/