一致性哈希算法及其在分布式系统中的应用

摘要

本文将会从实际应用场景出发,介绍一致性哈希算法(Consistent Hashing)及其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题;接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算法应用相关的话题。

继续阅读“一致性哈希算法及其在分布式系统中的应用”

Laravel 依赖注入源码解析

在 Laravel 的控制器的构造方法或者成员方法,都可以通过类型约束的方式使用依赖注入,如:

这里 $request 参数就使用了类型约束,Request 是一个类:\Illuminate\Http\Request,表示参数必须是这个类或子类。

本文通过分析 Laravel 的源码,看为什么方法中不需要传入实例就可以直接使用 Request 呢?只是框架自动帮我们实例化并传参了。

继续阅读“Laravel 依赖注入源码解析”

为什么 Laravel 会重复执行同一个队列任务?

在 Laravel 中使用 Redis 处理队列任务,框架提供的功能非常强大,但是最近遇到一个问题,就是发现一个任务被多次执行,这是为什么呢?

先说原因:因为在 Laravel 中如果一个队列(任务)执行时间大于 60 秒,就会被认为执行失败并重新加入队列中,这样就会导致重复执行同一个任务。

继续阅读“为什么 Laravel 会重复执行同一个队列任务?”

软件设计思想:先整体轮廓,再完善细节部分

《画家与黑客》一书作者在谈到软件设计思想的时候很有启发,尤其是做需求,如果你一开始就纠结细节而看不到整体,你可能花费很多时间还达不到预期的效果。要先有一个整体的轮廓,再完善各个部分和细节,或做出调整,这样你一开始就掌握全局,这应该是正确的方式。作者拿了印刷,雕刻,绘画,油画等艺术领域的例子来说明软件开发也应该如此。

继续阅读“软件设计思想:先整体轮廓,再完善细节部分”

Laravel Redis 多个进程同时取队列问题

开启多个进程处理队列会重复读取 Redis 中队列吗?是否因此导致重复执行任务?

使用 Supervisor 监听 Laravel 队列任务,其中 Supervisor 的配置如下:

注意 numprocs = 8,代表开启 8 个进程来执行 command 中的命令。

继续阅读“Laravel Redis 多个进程同时取队列问题”

Linux 中 bash 和 sh 的区别

使用 docker-compose,有的容器是 docker-compose exec workspace bash 进入,有的容器是 docker-compose exec php-worker sh 进入,bash 和 sh 是什么?有什么区别?

sh 和 bash 都是 Linux Shell 命令行语言,其中 sh 遵循 POSIX 标准。什么是 POSIX 标准?

Stack Overflow 上一篇答案讲的很详细,英文的慢慢看:

https://stackoverflow.com/questions/5725296/difference-between-sh-and-bash

MySQL 数据库设计及性能优化Tips

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。

注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节。另外MyISAM数据和索引是分开,而InnoDB的数据存储是按聚簇(cluster)索引有序排列的,主键是默认的聚簇(cluster)索引,因此MyISAM虽然在一般情况下,查询性能比InnoDB高,但InnoDB的以主键为条件的查询性能是非常高的。

继续阅读“MySQL 数据库设计及性能优化Tips”

使用 Laravel 消息队列要注意的问题

使用 Laravel 的消息队列处理异步任务,Redis 作为队列数据库,Supervisor 监控脚本异常中断并自动重启,这是 Laravel 处理队列任务的标准流程,但是实际中可能还会出现各种各样的问题,为了保证系统可靠性,还要注意几个问题。

一、执行失败重试次数设置

一定要设置任务执行失败重试次数,避免无限失败重试,超过重试次数 Laravel 会默认写到失败任务表中,也可以自己写执行失败后续处理逻辑。

继续阅读“使用 Laravel 消息队列要注意的问题”

php.ini 几个配置项说明

php.ini 几个常用的配置项整理。

max_execution_time

这设置了脚本被解析器中止之前允许的最大执行时间,单位秒。 这有助于防止写得不好的脚本占尽服务器资源。 默认设置为 30。 从命令行运行 PHP 时,默认设置为 0。

继续阅读“php.ini 几个配置项说明”