SQMQOS是云原生消息中间件,其设计初衷是为了将无服务器、容器和Kubernetes工作负载之间交换消息。本文将从多个方面深入讲解sqmqos的实现细节和特性。
一、MQTT协议支持
func NewMQTTProtocol() protocol.Protocol {
return &mqttProtocol{
qos: QoSThree,
}
}
type mqttProtocol struct {
qos QoSLevel
}
func (mp *mqttProtocol) QoS() QoSLevel {
return mp.qos
}
func (mp *mqttProtocol) TriggerConfig() (*ampool.Config, error) {
return ampool.DefaultConfig, nil
}
SQMQOS支持MQTT协议。接口`protocol.Protocol`是SQMQOS提供的基础协议接口。`mqttProtocol`实现了`protocol.Protocol`接口。在`NewMQTTProtocol`函数中,MQTT客户端连接时,`mqttProtocol`被创建并返回。`QoS`方法返回MQTT的QoS(服务质量)级别。`TriggerConfig`方法返回一个内部组件的统一配置。MQTT协议有三个服务质量级别:0,1和2。QoS级别1和2可以保证消息的可靠投递。在SQMQOS中,QoS3是最高的QoS级别,支持幂等和仅投递一次的消息传递保证,以及可靠地保证传递到目标。
二、轻量级的云原生架构
type Server struct {
Config Config
svc *service.Service
srv *http.Server
mm *am.MultiplexManager
}
func NewServer(config Config, tpo struct{} ) (*Server, error) {
srv := &http.Server{
Addr: config.Addr(),
Handler: newMux(config),
ReadTimeout: 70 * time.Second,
WriteTimeout: 70 * time.Second,
}
mm, err := am.NewMultiplexManager(ampool.Open(config.AMQP()), config.SQS())
if err != nil {
return nil, err
}
svc := service.New(mm, srv, config)
return &Server{
Config: config,
svc: svc,
srv: srv,
mm: mm,
}, nil
}
func (s *Server) Start() error {
err := s.svc.Start()
if err != nil {
return err
}
return s.srv.ListenAndServe()
}
SQMQOS实现了轻量级的云原生架构。`Server`实现了SQMQOS的服务器端。使用Golang语言实现,`Server`是一个HTTP服务器,它监听并处理到达服务地址的HTTP请求。在`NewServer`中,`http.Server`和`am.MultiplexManager`被初始化。`http.Server`提供HTTP层。`am.MultiplexManager`提供接口,以便处理来自不同传输方的消息。它考虑到多方传输-不限于HTTP,还可以是其他传输协议,如TCP和AMQP。其中,SQS是AWS的消息队列服务,以Amazon SQS作为队列后端。
三、可靠性
SQMQOS支持可靠的消息传递,这意味着邮件将在已发布后被传递到一个或多个订阅者。它采用三种级别的服务质量:QoS0,QoS1和QoS2。QoS0是最低的服务质量,它保证邮件仅会少量的进行编码和传输。这就是所谓的“最多一次,非保证的传输库存”保证。但这种级别的传输可以提供最小的可靠性。
高级别的服务质量将对协议进行更多方面的处理,以确保消息“幂等”(即消息被传递多次时,结果始终相同)并仅在一定程度上发送消息。
四、一些技术优化
SQMQOS通过复用TCP连接和HTTP/2协议提高性能。它非常适合云原生应用程序,因为它是容器化的,规模化的,可靠的,跨云和本地无服务器架构的。
五、主题订阅功能
type Subscriber struct {
topic string
sm *am.SubscriptionManager
}
func NewSubscriber(aq ampool.Queue, topic string, handlers ...sm.SubscriptionHandler) (*Subscriber, error) {
sm, err := am.NewSubscriptionManager(aq, topic, handlers...)
if err != nil {
return nil, err
}
return &Subscriber{
topic: topic,
sm: sm,
}, nil
}
func (s *Subscriber) Subscribe() error {
return s.sm.Subscribe()
}
func (s *Subscriber) Unsubscribe() error {
return s.sm.Unsubscribe()
}
主题订阅功能是MQTT协议的主要特性之一。它允许消息接收者订阅主题、标签或通配符规则。`Subscriber`是SQMQOS中实现主题订阅功能的一个重要结构体。它封装了`am.SubscriptionManager`结构体,实现主题订阅行为,具有`Subscribe`和`Unsubscribe`API。
六、结论
至此,我们详细地探讨了SQMQOS的实现和特性。从MQTT协议支持、轻量级的云原生架构、可靠性、一些技术优化和主题订阅功能等多个方面逐一阐述了异步消息传递中间件SQMQOS。SQMQOS的设计目的是提供一种高质量、低延迟、高可伸缩性、经济高效的消息基础设施。