苍穹外卖业务整理

打印 上一主题 下一主题

主题 1561|帖子 1561|积分 4685

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.简历写法

西南村小吃校园送
本项目是专门为天大西南村小吃街店铺定制的一款点餐平台。商家可以对餐厅的菜品、套餐等信息进行维护。学生可以在小程序端下单。
责任描述:
使用 JWT 令牌封装用户 Token,自定义封装了拦截器校验 JWT 令牌的有用性
使用 OSS 存储菜品和套餐素材、使用 Redis 缓存数据,提升用户访问速率
基于 AOP 实现公共字段(比方创建时间、创建人)的自动填充功能,镌汰代码,低落耦合
使用 Redisson 内置的延迟队列 RDelayedQueue 实现超时订单自动取消订单功能。
使用 WebSocket 实现来单提示和客户催单功能,并使用 Redis 实现催单频率限定功能
2. 超时订单自动取消功能

实现思绪:

使用 Redisson 提供的内置延迟队列 RDelayedQueue 来管理超时订单的自动取消。通过将超时订单放入延迟队列,系统可以在指定时间后自动执行取消操纵。
具体步调:



  • 订单创建时: 当用户下单时,系统会记载订单的创建时间和超时时间(比方 15 分钟后)。
  • 将订单放入延迟队列:

    • 使用 RDelayedQueue 将须要超时取消的订单放入队列。可以指定延迟时间,比方将订单信息对象放入队列,延迟 15 分钟。
    • 示例代码:
      1. RDelayedQueue<Order> delayedQueue = redissonClient.getDelayedQueue("order-cancel-queue");
      2. delayedQueue.offer(order, 15, TimeUnit.MINUTES);
      复制代码

  • 订单取消处理:

    • 创建一个斲丧者来监听延迟队列,一旦超时订单到达,斲丧者会自动取消该订单,更新订单状态为“已取消”。
    • 示例代码:
      1. delayedQueue.consume(order -> {
      2.     orderService.cancelOrder(order.getId());
      3. });
      复制代码

上风:



  • 自动化: 无需人工干预,镌汰了管理成本。
  • 高效: 通过使用延迟队列,系统可以或许在规定时间后自动处理超时订单,提高了用户体验。
Redisson 的 RDelayedQueue 详解

RDelayedQueue 是 Redisson 提供的一个延迟队列实现,它允许将任务延迟执行,适用于处理超时订单的自动取消。这是通过将任务放入队列并指定延迟时间来实现的。以下是对 RDelayedQueue 的具体解释和怎样使用它来管理超时订单的自动取消。
1. 根本概念



  • 延迟队列: 延迟队列是一种特别的队列,允许在特定的延迟后才将任务从队列中取出并执行。在处理超时订单时,可以将订单放入延迟队列,设置延迟时间,其时间到达后,系统会自动执行相应的操纵(如取消订单)。
2. 使用场景

在一个点餐系统中,用户下单后,如果在规定时间内(比方 15 分钟)未完成支付,系统须要自动取消该订单。使用 RDelayedQueue 可以轻松实现这一点。
3. 实现步调

以下是使用 RDelayedQueue 进行超时订单管理的具体步调:
a. 引入依赖

起首,确保你的项目中已经引入了 Redisson 的依赖。通常在 Maven 项目中,依赖如下:
xml
  1. <dependency>
  2.     <groupId>org.redisson</groupId>
  3.     <artifactId>redisson-spring-boot-starter</artifactId>
  4.     <version>3.16.4</version> <!-- 使用最新版本 -->
  5. </dependency>
复制代码
b. 创建 RDelayedQueue 实例

在服务中,注入 Redisson 客户端并创建 RDelayedQueue 实例。
  1. @Autowired
  2. private RedissonClient redissonClient;
  3. // 创建延迟队列
  4. RDelayedQueue<Order> delayedQueue = redissonClient.getDelayedQueue("order-cancel-queue");
复制代码
c. 放入延迟队列

在用户下单时,将订单放入延迟队列,并设置延迟时间(比方 15 分钟)。
  1. public void placeOrder(Order order) {
  2.     // 处理订单逻辑
  3.     orderMapper.insert(order);
  4.    
  5.     // 将订单放入延迟队列,15分钟后执行取消
  6.     delayedQueue.offer(order, 15, TimeUnit.MINUTES);
  7. }
复制代码
d. 处理超时订单

创建一个斲丧者来处理延迟队列中的订单。当订单超时到达时,从队列中斲丧订单,并执行取消操纵。
  1. public void processDelayedOrders() {
  2.     delayedQueue.consume(order -> {
  3.         // 执行取消订单的逻辑
  4.         cancelOrder(order.getId());
  5.     });
  6. }
复制代码
e. 取消订单的方法

实现取消订单的具体逻辑,根据订单 ID 更新订单状态。
  1. public void cancelOrder(Long orderId) {
  2.     Orders order = orderMapper.findById(orderId);
  3.     if (order != null && order.getStatus() == Orders.PENDING_PAYMENT) {
  4.         order.setStatus(Orders.CANCELLED);
  5.         order.setCancelReason("订单超时,自动取消");
  6.         orderMapper.update(order);
  7.     }
  8. }
复制代码
4. 长处



  • 简化代码: 使用 RDelayedQueue 使得超时处理逻辑更清晰,克制了复杂的定时任务管理。
  • 高效: 延迟队列在 Redis 中高效实现,可以或许处理大量的超时订单。
  • 可靠性: Redisson 提供的集群支持和恒久化机制,使得延迟队列在高并发情况下也能稳定工作。
5. 留意事项



  • Redis 配置: 确保 Redis 配置精确,以支持延迟队列的使用。
  • 任务处理: 斲丧者须要处理异常情况,比方订单已经被取消的情况,确保系统的健壮性。
  • 监控: 监控队列的状态,确保没有长时间堆积的任务,克制系统负担。
RDelayedQueue比Spring Task处理超时订单的自动取消的上风

使用 RDelayedQueueSpring Task 处理超时订单的自动取消各有上风,但在某些方面,RDelayedQueue 提供了明显的上风。以下是两者的比较:
1. 延迟处理机制



  • RDelayedQueue:

    • 提供内置的延迟队列功能,可以将任务放入队列中并指定一个延迟时间。
    • 任务会在指定的延迟时间后自动处理,简化了超时管理的实现。

  • Spring Task:

    • 通常使用定时任务(如 @Scheduled 注解)来定期检查超时订单。
    • 须要额外的逻辑来判断哪些订单已经超时,增加了复杂性。

2. 实时性和效率



  • RDelayedQueue:

    • 任务一旦到达设置的延迟时间,会立即被处理,确保实时性。
    • 适用于须要快速响应的系统,克制了不须要的轮询。

  • Spring Task:

    • 依赖于定时任务的执行频率(比如每分钟一次),大概导致超时处理的延迟。
    • 在高并发场景下,大概会出现检查不实时的情况。

3. 资源斲丧



  • RDelayedQueue:

    • 在 Redis 中实现,使用 Redis 的高效存储和操纵能力,可以或许轻松处理大量延迟任务。
    • 不会斲丧应用的 CPU 资源用于轮询检查。

  • Spring Task:

    • 须要定期执行任务,大概导致 CPU 资源浪费,尤其是在任务间隔较短时。
    • 在高并发情况下,大概导致任务执行的竞争和资源争用。

4. 代码简洁性



  • RDelayedQueue:

    • 通过简单的 API 调用就能实现延迟处理,代码更简洁明白。
    • 镌汰了冗余的逻辑,易于维护。

  • Spring Task:

    • 须要编写额外的逻辑来遍历订单,检查状态,增加了代码复杂性。
    • 维护起来相对贫苦,尤其在处理复杂业务逻辑时。

5. 错误处理与重试机制



  • RDelayedQueue:

    • 可以使用 Redis 的特性,轻松实现失败重试机制,确保任务的可靠性。
    • 可以在任务失败时重新放入队列,指定新的延迟时间。

  • Spring Task:

    • 须要手动实现重试机制,增加了代码复杂性。
    • 错误处理大概不敷灵活,尤其在高并发情况下。

6. 可扩展性



  • RDelayedQueue:

    • 通过 Redis 集群可以很容易地扩展,以支持更高的并发和更大的数据量。
    • 得当大规模应用,处理大量超时订单。

  • Spring Task:

    • 受限于单个应用实例的能力,扩展性较差。
    • 在高并发场景下,大概会出现性能瓶颈。

3. 订单催单提示功能

实现思绪:

使用 WebSocket 实现实时的订单催单提示,并使用 Redis 来限定催单的频率,防止用户频繁催单。
具体步调:



  • WebSocket 毗连:

    • 客户端在下单后与服务端建立 WebSocket 毗连。如许,服务端可以实时向客户端推送消息。
    • 示例代码:
      1. @OnOpen
      2. public void onOpen(Session session) {
      3.     // 记录用户的 WebSocket 会话
      4. }
      复制代码

  • 催单请求:

    • 当用户点击“催单”按钮,客户端会发送催单请求到服务端。
    • 服务端吸收到催单请求后,起首检查催单的频率:

      • 使用 Redis 记载每个用户的催单时间戳,比方使用用户 ID 作为键,存储迩来一次催单的时间。
      • 如果在规定的时间内再次催单,则拒绝请求并返回提示信息。
      • 示例代码:
        1. String key = "user:" + userId + ":last催单时间";
        2. Long last催单时间 = redisTemplate.opsForValue().get(key);
        3. if (last催单时间 != null && System.currentTimeMillis() - last催单时间 < 60000) {
        4.     // 超过频率限制,拒绝催单
        5.     return;
        6. }
        7. // 更新催单时间
        8. redisTemplate.opsForValue().set(key, System.currentTimeMillis());
        复制代码


  • 发送催单消息:

    • 如果催单请求被接受,服务端通过 WebSocket 向对应的餐厅商家发送催单提示。
    • 示例代码: java
      复制
      1. session.getBasicRemote().sendText("用户催单提醒");
      复制代码

上风:



  • 实时交互: 使用 WebSocket 实现了实时的用户与商家的互动,提高了用户体验。
  • 频率控制: 通过 Redis 实现的频率限定功能,克制了用户的恶意催单,保护了商家的正常运营。
4.业务逻辑总结

苍穹外卖项目总结_苍芎外卖怎样实现的跨域-CSDN博客

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南七星之家

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表