You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

general.md 3.1 KiB

4 years ago
4 years ago
4 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. # 基本
  2. CAP 需要使用具有持久化功能的存储介质来存储事件消息,例如通过数据库或者其他NoSql设施。CAP 使用这种方式来应对一切环境或者网络异常导致消息丢失的情况,消息的可靠性是分布式事务的基石,所以在任何情况下消息都不能丢失。
  3. ## 持久化
  4. ### 发送前
  5. 在消息进入到消息队列之前,CAP使用本地数据库表对消息进行持久化,这样可以保证当消息队列出现异常或者网络错误时候消息是没有丢失的。
  6. 为了保证这种机制的可靠性,CAP使用和业务代码相同的数据库事务来保证业务操作和CAP的消息在持久化的过程中是强一致的。也就是说在进行消息持久化的过程中,任何一方发生异常情况数据库都会进行回滚操作。
  7. ### 发送后
  8. 消息进入到消息队列之后,CAP会启动消息队列的持久化功能,我们需要说明一下在 RabbitMQ 和 Kafka 中CAP的消息是如何持久化的。
  9. 针对于 RabbitMQ 中的消息持久化,CAP 使用的是具有消息持久化功能的消费者队列,但是这里面可能有例外情况,参加 2.2.1 章节。
  10. 由于 Kafka 天生设计的就是使用文件进行的消息持久化,在所以在消息进入到Kafka之后,Kafka会保证消息能够正确被持久化而不丢失。
  11. ## 消息存储
  12. 在 CAP 启动后,会向持久化介质中生成两个表,默认情况下名称为:`Cap.Published` `Cap.Received`。
  13. ### 存储格式
  14. **Published** 表结构:
  15. NAME | DESCRIPTION | TYPE
  16. :---|:---|:---
  17. Id | Message Id | int
  18. Version | Message Version | string
  19. Name | Topic Name | string
  20. Content | Json Content | string
  21. Added | Added Time | DateTime
  22. ExpiresAt | Expire time | DateTime
  23. Retries | Retry times | int
  24. StatusName | Status Name | string
  25. **Received** 表结构:
  26. NAME | DESCRIPTION | TYPE
  27. :---|:---|:---
  28. Id | Message Id | int
  29. Version | Message Version | string
  30. Name | Topic Name | string
  31. Group | Group Name | string
  32. Content | Json Content | string
  33. Added | Added Time | DateTime
  34. ExpiresAt | Expire time | DateTime
  35. Retries | Retry times | int
  36. StatusName | Status Name | string
  37. ### 包装器对象
  38. CAP 在进行消息发送到时候,会对原始消息对象进行一个二次包装存储到 `Content` 字段中,以下为包装 Content 的 Message 对象数据结构:
  39. NAME | DESCRIPTION | TYPE
  40. :---|:---|:---
  41. Id | CAP生成的消息编号 | string
  42. Timestamp | 消息创建时间 | string
  43. Content | 内容 | string
  44. CallbackName | 回调的订阅者名称 | string
  45. 其中 Id 字段,CAP 采用的 MongoDB 中的 ObjectId 分布式Id生成算法生成。
  46. ## 社区支持的持久化
  47. 感谢社区对CAP的支持,以下是社区支持的持久化的实现
  48. * SQLite ([@colinin](https://github.com/colinin)) :https://github.com/colinin/DotNetCore.CAP.Sqlite
  49. * LiteDB ([@maikebing](https://github.com/maikebing)) :https://github.com/maikebing/CAP.Extensions
  50. * SQLite & Oracle ([@cocosip](https://github.com/cocosip)) :https://github.com/cocosip/CAP-Extensions
  51. * SmartSql ([@xiangxiren](https://github.com/xiangxiren)) :https://github.com/xiangxiren/SmartSql.CAP