81 lines
2.4 KiB
Plaintext
81 lines
2.4 KiB
Plaintext
|
|
package gameLogMgr
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"fmt"
|
|||
|
|
|
|||
|
|
"github.com/Shopify/sarama"
|
|||
|
|
"goutil/debugUtil"
|
|||
|
|
"goutil/logUtilPlus"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
var (
|
|||
|
|
producer sarama.AsyncProducer
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
// 启动生产者
|
|||
|
|
// 参数:
|
|||
|
|
// brokerList:Broker地址
|
|||
|
|
// userId:用户名(可默认为空字符串)
|
|||
|
|
// passWard:密码(可默认为空字符串)
|
|||
|
|
// 返回值:
|
|||
|
|
// 无
|
|||
|
|
func Start(brokerList []string, userId string, passWard string) {
|
|||
|
|
/*
|
|||
|
|
设置 acks = all。acks 是 Producer 的一个参数,代表了你对“已提交”消息的定义。如果设置成 all,则表明所有副本 Broker 都要接收到消息,该消息才算是“已提交”。这是最高等级的“已提交”定义。
|
|||
|
|
对于游戏日志,设置为WaitForLocal即可;如果是游戏数据,则应设置为WaitForAll
|
|||
|
|
设置 retries 为一个较大的值。这里的 retries 同样是 Producer 的参数,对应前面提到的 Producer 自动重试。当出现网络的瞬时抖动时,消息发送可能会失败,此时配置了 retries > 0 的 Producer 能够自动重试消息发送,避免消息丢失。
|
|||
|
|
*/
|
|||
|
|
var err error
|
|||
|
|
config := sarama.NewConfig()
|
|||
|
|
|
|||
|
|
config.Net.SASL.User = userId
|
|||
|
|
config.Net.SASL.Password = passWard
|
|||
|
|
config.Producer.Return.Successes = false
|
|||
|
|
config.Producer.Return.Errors = true
|
|||
|
|
config.Producer.Retry.Max = 10
|
|||
|
|
config.Producer.RequiredAcks = sarama.WaitForLocal
|
|||
|
|
producer, err = sarama.NewAsyncProducer(brokerList, config)
|
|||
|
|
if err != nil {
|
|||
|
|
panic(fmt.Errorf("Kafka Start failed. Error: %v\n", err))
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
go func() {
|
|||
|
|
for err := range producer.Errors() {
|
|||
|
|
debugUtil.Printf("Send message to kafka failed. Error: %v\n", err.Err)
|
|||
|
|
logUtilPlus.ErrorLog("Send message to kafka failed. Error: %v\n", err.Err)
|
|||
|
|
}
|
|||
|
|
}()
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func Stop() {
|
|||
|
|
if producer != nil {
|
|||
|
|
err := producer.Close()
|
|||
|
|
if err != nil {
|
|||
|
|
debugUtil.Printf("Stop kafka failed. Error: %v\n", err)
|
|||
|
|
logUtilPlus.ErrorLog("Stop kafka failed. Error: %v\n", err)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 写入游戏日志
|
|||
|
|
// 参数:
|
|||
|
|
// serverGroupId: 游戏服务器组Id
|
|||
|
|
// key: 标识
|
|||
|
|
// message: 日志
|
|||
|
|
// 返回值: 无
|
|||
|
|
func Write(topic string, serverGroupId int32, message string) {
|
|||
|
|
if producer == nil {
|
|||
|
|
debugUtil.Printf("Send message to kafka failed. producer is nil")
|
|||
|
|
logUtilPlus.ErrorLog("Send message to kafka failed. producer is nil")
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
msg := &sarama.ProducerMessage{}
|
|||
|
|
msg.Topic = topic
|
|||
|
|
msg.Key = sarama.StringEncoder(fmt.Sprintf("%d", serverGroupId))
|
|||
|
|
msg.Value = sarama.ByteEncoder(message)
|
|||
|
|
|
|||
|
|
// Send to kafka
|
|||
|
|
producer.Input() <- msg
|
|||
|
|
}
|