Golang Go语言中的微博消息队列
离开微博已久,总想着弄点东西出来纪念一下当年的峥嵘岁月:)。在微博,你不能不知道鸟哥 Laruence ,也不能不知道 mq 。 mq 是一个基于 memcached 协议,用 c/c++编写的消息队列中间件,有着高性能、解耦、异步化等特点。现在用 Go 重新实现了一遍,将早前自己用 mq 的过程中觉得有些特性可以加上的,都一一加上了,由于其依赖的东西极少,只是简单用了一个轻巧型的嵌入式数据库 BerkeleyDB ,就可以实现一个 simple 的队列服务 tcp server ,见https://github.com/YoungPioneers/mgq,特性如下:
- 一写多读:举个例子, set myqueue message ,只要 get 的时候, myqueue 开头,#分隔,如 myqueue#1 ,多个客户端之间读是彼此独立的,是不受影响的 默认的 get 是读取队列中未读取的最旧消息
- 支持 getc 操作,支持获取队列中某一个 cursor 位置的数据:举个例子,假设 myqueue 已经有 1000 条数据, getc myqueue 99,就可以获取队列当中 cursor 为 99 的消息 *支持 getr 操作,支持获取队列中某一个 start cursor 位置开始,到 end 的数据:举个例子,假设 myqueue 已经有 20 条数据, getr myqueue 1 10 ,就可以获取队列当中 cursor 为[1-10]的消息
- getn 支持 timeout 机制的阻塞 api 来获取队列中的最新消息,举个例子: getn queue 10,意味着 10s 内有数据则立马返回,否则会 10s 后立马返回数据不存在的错误,默认 getn 的 timeout 是 0s ,永不超时(需要注意的是如果客户端有 getn 的操作,则 set 的另一个客户端需要调用 setn )
Golang Go语言中的微博消息队列
更多关于Golang Go语言中的微博消息队列的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
公司小,用不起 kafka 这么个集群
最近在了解 message queue 这项技术,请问微博内部的消息队列用的是哪种实现?
还有 memcached 协议与 AMQP 协议有哪些区别呢?
没给出 benchmark ,没给吞吐量,没说怎么保证可靠性和可靠性有多少,会不会丢数据
这东西在这样的介绍下真会有人用么
楼主快把文档完善一下
谢谢,是的, todo 里面就有,周末就加上
感谢回复!
感谢分享。
以前用 RabbitMQ ,现在用 beanstalk
已经不是说微博的队列是基于 redis 的 list 吗?。
在微博,有基于 redis 改造的组件,应用于点赞数,转发数等, mq 是自研的用于如博文消息体的中间存储
现有 queue 比较多,场景不一样,选取也不同。以前总好奇消息队列是怎么实现,打算自己动手弄一个,明白下原理,后面也打算对比下各种 queue 之间的性能对比图
在Golang(Go语言)中实现微博消息队列,通常需要结合并发处理、数据结构以及网络编程等多个方面的知识。以下是一个简要的实现思路:
-
数据结构选择:
- 可以使用Go的切片(slice)或通道(channel)作为消息队列的基础数据结构。对于高并发场景,通道是更好的选择,因为它内置了同步机制,可以避免竞态条件。
-
并发处理:
- Go语言以其强大的并发处理能力著称,可以使用goroutine来并发地处理消息的生产和消费。每个goroutine可以看作是一个轻量级的线程。
-
网络编程:
- 微博消息队列通常需要通过网络进行消息的传递。可以使用Go的net包来实现TCP或UDP协议的网络通信。对于更复杂的需求,还可以考虑使用HTTP/2或WebSocket等协议。
-
消息序列化与反序列化:
- 消息在传递过程中需要进行序列化,以便在网络中传输。Go语言支持多种序列化方式,如JSON、XML、Protobuf等。选择合适的序列化方式可以提高传输效率和解析速度。
-
错误处理与重试机制:
- 在实现消息队列时,需要考虑网络故障、消息丢失等异常情况。可以通过实现重试机制、消息持久化等方式来提高系统的健壮性。
综上所述,实现一个微博消息队列需要综合运用Go语言的数据结构、并发处理、网络编程以及序列化等多个方面的知识。通过合理的架构设计和代码实现,可以构建出一个高效、稳定的消息队列系统。