前端BFF(Backend For Frontend)架构模式中,一般会呈现网络恳求重复的问题。这个问题首要指的是一个恳求被发送到服务端,但是在等待呼应的过程中,相同的恳求又被发送了一次。为了处理这个问题,你能够考虑以下几种战略:

  1. 恳求去重:在前端或许 BFF 层保护一个正在进行中的恳求列表。当新的恳求抵达时,首先查看这个列表,假如发现相同的恳求现已在执行中,就丢弃新的恳求或许让新的恳求等待旧的恳求完结。具体操作能够用散列函数来完成恳求的快速查找。

  2. 缓存战略:关于 GET 类型的恳求,能够在 BFF 层引进缓存机制,比如 Redis,或许运用 HTTP 的缓存操控机制。这样,在恳求抵达服务端之前,先在缓存中查找是否有对应的呼应,假如有,就直接回来,防止了重复的网络恳求。需求留意的是,缓存战略必须正确处理缓存过期和更新问题。

  3. 运用防抖和节省技能:在前端,能够运用防抖和节省技能来防止短时刻内发送大量重复的恳求。防抖技能是将多次高频操作优化为只在最后一次执行,节省技能是每隔一段时刻后执行一次,也就是下降频率。

  4. 幂等性处理:关于 POST, PUT, DELETE 等非幂等性的 HTTP 恳求,能够在服务端引进幂等性处理机制,比如为每个恳求分配一个仅有的 ID,在处理恳求之前先查看这个 ID 是否现已处理过。

留意,以上的战略都有其运用的场景和约束,需求依据具体的事务需求和体系规划来挑选合适的战略。

第2点和第4点尽管都能够在一定程度上处理网络恳求重复的问题,但它们的办法和侧重点是不同的。

  1. 缓存战略:首要适用于那些对数据实时性要求不高的 GET 恳求。缓存战略的首要思想是,当客户端发送相同的 GET 恳求时,服务器不必每次都去数据库中重新检索数据,而是能够直接从缓存中回来之前检索过的成果,然后减少对数据库的拜访,进步体系的呼应速度。这个战略一般不能用于 POST、PUT、DELETE 等会改动服务器状况的恳求。

  2. 幂等性处理:首要用于处理或许改动服务器状况的恳求,如 POST、PUT、DELETE 等。幂等性是指不管一个操作被执行多少次,其成果都坚持不变。在网络恳求中,通过为每个恳求分配一个仅有的 ID,并查看这个 ID 是否现已处理过,能够保证即使网络恳求被重复发送,服务器的状况也只会改动一次。这个战略能够保证网络恳求的正确性,但不能进步呼应速度或减少数据库拜访。

用Redis存储的是什么数据结构,已然不能用POST、PUT、DELETE,那是只能用于GET吗?

缓存战略一般用于加快数据的获取速度,减少服务器压力,进步呼应速度。在BFF架构中,你或许会在 BFF 层接口对接服务端数据,然后将这些数据进行缓存,一般是 GET 恳求的数据,因为 GET 恳求一般用于读取数据,不改动数据的状况,所以适合缓存。

当客户端发送恳求时,BFF 层会首先查看缓存中是否有对应的数据,假如有,就直接回来缓存中的数据,否则,再向服务端恳求数据,并将恳求得到的数据存入缓存。这种战略能够大大减少对服务端的恳求次数,然后减轻服务端的压力,而且由于从缓存中获取数据的速度远快于从服务端获取数据,所以也能够进步体系的呼应速度。

在运用 Redis 作为缓存时,能够依据需求运用不同的数据结构,如 String(字符串)、List(列表)、Set(调集)、Sorted Set(有序调集)和 Hash(哈希表)。一般,能够将恳求的 URL 和参数作为 key,将恳求的成果作为 value,存储为 String 类型的数据。在处理恳求时,只需求依据恳求的 URL 和参数生成 key,然后在 Redis 中查找这个 key 对应的 value。

关于 POST、PUT、DELETE 等会改动服务端数据的恳求,由于这些恳求会改动数据的状况,所以缓存的数据或许会和服务端的数据不一致,然后导致错误。因此,这些恳求一般不适合缓存。但是,在某些情况下,能够依据事务逻辑,对 POST、PUT、DELETE 的成果进行缓存。例如,假如 POST 恳求的成果只取决于恳求的参数,而不依赖于其他状况,那么也能够将这个成果缓存起来。

缓存战略时,怎么处理缓存过期和更新问题

处理缓存过期和更新是运用缓存战略的重要组成部分。下面列出了几种常见的处理办法:

  1. 定时过期:缓存数据时,设置一个固定的过期时刻,例如10分钟、1小时等。过了这个时刻,缓存主动失效。这种方法简单直接,但或许存在数据过早过期(浪费了缓存资源)或过晚过期(缓存数据过期)的问题。

  2. 拜访过期:根据最后拜访时刻来过期数据,例如在10分钟内没有被拜访就过期。这样能保证热门数据一直在缓存中,不常用的数据则被淘汰。

  3. 主动更新:当有对数据的更新操作(如 POST、PUT 或 DELETE 恳求)时,主动更新或铲除缓存。这种方法能较好地保证缓存数据和数据库数据的一致性,但需求保护较复杂的更新逻辑。

  4. 懒加载:只在数据被拜访时才加载到缓存中。当数据过期时,能够直接从缓存中删除,下次恳求时再从数据库中加载。

  5. 运用分布式缓存:假如体系是一个分布式体系,能够运用分布式缓存,例如 Redis Cluster 或 Memcached。这些缓存体系支持数据的主动过期,而且能够在多个节点之间仿制数据,进步数据的可用性。