可靠,容错和可扩展的解决方案,用于跟踪不同mongo集合的更新

时间:2018-03-29 05:15:53

标签: java mongodb rabbitmq microservices

//CouponCartRule - MongoDB
{
  "id": 1,

  "applicability": {
    "validFrom": "12-MAR-2017T01:00:00Z",
    "validTill": "12-MAR-2019T01:00:00Z"
  },

  "maxUsage": 100,
  "currentUsage": 99,
  "maxBudget": 1000,
  "currrentBudget": 990
}


//UniqueCoupon collection  - MongoDB
{
  "ruleId": 1,
  "couponCode": "CITIDEALMAR18",
  "currentCouponUsage": 90,
  "validFrom": "12-MAR-2018T01:00:00Z",
  "validTill": "12-APR-2018T01:00:00Z"
}

{
  "ruleId": 1,
  "couponCode": "CITIDEALAPR18",
  "currentCouponUsage": 9,
  "validFrom": "12-JAN-2018T01:00:00Z",
  "validTill": "12-FEB-2018T01:00:00Z"
}


//Order - MongoDB
{
  "id": 112,
  "total": {
    "discountCode": "CITIDEALMAR18",
    "discount": 10,
    "total": 90,
    "grandTotal": 90

  },
  "items": []
}

问题说明

CouponCartRule将为订单中的优惠券代码定义条件。

每个购物车规则都可以有n个优惠券,可以覆盖特定条件。

这样做是为了重复使用CouponCartRule但在它们下面创建不同的优惠券,并且CouponCartRule下的优惠券可以增长到最多10K记录。

当订单成功下单时,订单将应用couponCode和折扣。

订单收集由OM团队管理,非常大。 我们在创建/取消订单时收到订单添加/取消事件。

我需要检查结帐时是否违反了maxUsage和maxBudget。

我打算收听订单添加和取消活动,更新订单添加和订购取消活动的使用情况。

步骤

  • 更新当前使用的UniqueCoupon用户[mongo的inc运营商]
  • 更新currentUsage&使用
  • 预算CouponCartRule的统计数据

如果有停机时间,任何关于使代码具有幂等性的建议,如果步骤2中存在失败,则侦听器将向DLQ发送消息,并且计数将再次更新,这是不希望的。

我想到的一个选项是在UniqueCoupon级别跟踪和记录统计数据,然后在SCR级别聚合[当使用后续优惠券时,聚合操作最终将保持一致]。

由于此代码是实时调用的,因此应该是高效的。

1 个答案:

答案 0 :(得分:0)

我最终提出了以下解决方案,这是由我们的infra [rabbit mq和mongodb]支持的。以下是设计审核后接受的解决方案。希望这有助于有类似问题的人。

  • 系统从订单管理接收订单添加/取消事件。
  • 如果按顺序使用优惠券代码,我们会根据订单ID将数据记录到数据库中。
  • 订单添加活动 - 跟踪优惠券代码,orderId,折扣,couponRuleId,更新等。基于orderId的upsert和更新couponUsed标志为“APPLIED”
  • 订单取消事件 - Upsert orderId基于orderId并更新couponUsed标志为“NOT_APPLIED”
  • 将“coupon_usage_tracker”上的Mongo TTL设为3个月/ 6个月。
  • 通过传递所需数据,根据最后一个在COUPON_RULE_SUMMARY和COUPON_SUMMARY仪表板上触发同步。触发同步机制是通过MQ实现的,因为我们可以通过DLQ设置自动重试失败。
    • 如果COUPON_RULE_SUMMARY和COUPON_SUMMARY的触发同步失败,则会在下一个优惠券代码使用中更新正确值[最终一致性]。
    • 配置集合将不具有可变状态,并且将严格配置。这让我们可以缓存配置。



//COUPON_USAGE_TRACKER
{
    "ruleId": 948,
    "couponCode": "TENOFF",
    "couponId": 123,
    "order": {
        "created_at": "",
        "udpated_at": "",
        "member_id": 221930,
        "member_order_count": 5,
        "publicId": "4asdff-23ewea-232",
        "id": 234123,
        "total": {
            "discount_code": "TENOFF",
            "discount": "10",
            "grand_total": 100,
            "sub_total": 10
        }
    }
}

//COUPON_RULE_SUMMARY
{
    "ruleId": 948,
    "last_update_at": "",
    "currentUsage": 100,
    "currentBudget": 1000
}

//COUPON_SUMMARY
{
    "ruleId": 948,
    "couponId": 948,
    "last_update_at": "",
    "currentUsage": 100,
    "currentBudget": 1000
 
}




SYSTEM DESIGN FOR THE SOLUTION