利用msg_id应对通知业务的去重设计

作者Veris 文章分类 分类:PHP 文章评论 0条评论 阅读次数 已被围观 31

情景

在许多常见场景如支付回调的消息通知,需保障消息可靠性,实行消息至少传达一次的策略,即通知时根据业务方响应的状态码返回码响应时间来判定业务有效性,如未响应正常的业务状态,通知服务应重新通知。

msg_id的应用及生成

中大型厂商在做消息通知时都会附带msg_id参数,以此便于业务方回溯、去重
msg_id生成方法没有明确规定,一般需符合以下特点:

  • 唯一性(此外需要考虑分布式唯一的情况)
  • 不宜过长
  • 可扩展性(避免所有业务共用同一生成规则,造成ID池不够分)

我们可以使用UUID标准作为msg_id

UUID 是 通用唯一识别码(Universally Unique Identifier)的缩写,是一种软件建构的标准,亦为开放软件基金会组织在分布式计算环境领域的一部分。其目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。目前最广泛应用的UUID,是微软公司的全局唯一标识符(GUID),而其他重要的应用,则有Linux ext2/ext3文件系统、LUKS加密分区、GNOME、KDE、Mac OS X等等。另外我们也可以在e2fsprogs包中的UUID库找到实现。
UUID是由一组32位数的16进制数字所构成,所以UUID理论上的总数为16^32=2^128,约等于3.4 x 10^38。也就是说若每纳秒产生1兆个UUID,要花100亿年才会将所有UUID用完。
UUID的标准型式包含32个16进制数字,以连字号分为五段,形式为8-4-4-4-12的32个字符。示例:
550e8400-e29b-41d4-a716-446655440000
详细说明参照:https://baike.baidu.com/item/UUID/5921266?fr=aladdin

简单的生成栗子:

function  uuid()  
{  
    $chars = md5(uniqid(mt_rand(), true));  
    $uuid = substr ( $chars, 0, 8 ) . '-'
            . substr ( $chars, 8, 4 ) . '-' 
            . substr ( $chars, 12, 4 ) . '-'
            . substr ( $chars, 16, 4 ) . '-'
            . substr ( $chars, 20, 12 );  
    return $uuid ;  
}

另外,也可利用自增ID作为msg_id

分类:PHP

【上一篇】PHP队列SplQueue
【下一篇】大小端字节序释义

发表评论: