Обновить server.go
This commit is contained in:
parent
e01aca0cdb
commit
a2caa4a3a1
26
server.go
26
server.go
@ -84,7 +84,7 @@ func (s *server) CreateChat(ctx context.Context, req *proto.CreateChatRequest) (
|
|||||||
errMsg := fmt.Sprintf("One or both users don't exist: user1=%d (%t), user2=%d (%t)",
|
errMsg := fmt.Sprintf("One or both users don't exist: user1=%d (%t), user2=%d (%t)",
|
||||||
user1, user1Exists, user2, user2Exists)
|
user1, user1Exists, user2, user2Exists)
|
||||||
s.logger.Println(errMsg)
|
s.logger.Println(errMsg)
|
||||||
return nil, fmt.Errorf("%w", errors.New(errMsg)) // Оборачиваем ошибку
|
return nil, fmt.Errorf("%w", errors.New(errMsg))
|
||||||
}
|
}
|
||||||
|
|
||||||
var chat proto.Chat
|
var chat proto.Chat
|
||||||
@ -182,8 +182,7 @@ func (s *server) SendMessage(ctx context.Context, req *proto.SendMessageRequest)
|
|||||||
|
|
||||||
message.CreatedAt = timestamppb.New(createdAt)
|
message.CreatedAt = timestamppb.New(createdAt)
|
||||||
|
|
||||||
// Для RabbitMQ отправляем расшифрованное сообщение (или зашифрованное, в зависимости от требований)
|
|
||||||
// Здесь отправляем расшифрованное для совместимости с существующими клиентами
|
|
||||||
decryptedContent, err := s.crypto.DecryptMessage(encryptedContent, encryptedKey, nonce)
|
decryptedContent, err := s.crypto.DecryptMessage(encryptedContent, encryptedKey, nonce)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Printf("Failed to decrypt for RabbitMQ: %v", err)
|
s.logger.Printf("Failed to decrypt for RabbitMQ: %v", err)
|
||||||
@ -290,7 +289,6 @@ func (s *server) GetChat(ctx context.Context, req *proto.GetChatRequest) (*proto
|
|||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.logger.Printf("Failed to decrypt last message: %v", err)
|
s.logger.Printf("Failed to decrypt last message: %v", err)
|
||||||
// Можно вернуть ошибку или пустое сообщение
|
|
||||||
decryptedContent = "[не удалось расшифровать]"
|
decryptedContent = "[не удалось расшифровать]"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -497,7 +495,6 @@ func (s *server) StreamMessages(req *proto.StreamMessagesRequest, stream proto.M
|
|||||||
ctx, cancel := context.WithTimeout(stream.Context(), 24*time.Hour)
|
ctx, cancel := context.WithTimeout(stream.Context(), 24*time.Hour)
|
||||||
defer cancel()
|
defer cancel()
|
||||||
|
|
||||||
// Механизм переподключения с экспоненциальной задержкой
|
|
||||||
retryDelay := time.Second
|
retryDelay := time.Second
|
||||||
const maxRetries = 5
|
const maxRetries = 5
|
||||||
|
|
||||||
@ -508,12 +505,11 @@ func (s *server) StreamMessages(req *proto.StreamMessagesRequest, stream proto.M
|
|||||||
default:
|
default:
|
||||||
err := s.runStream(ctx, req, stream)
|
err := s.runStream(ctx, req, stream)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return nil // Успешное завершение
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
s.logger.Printf("Stream error (attempt %d/%d): %v", i+1, maxRetries, err)
|
s.logger.Printf("Stream error (attempt %d/%d): %v", i+1, maxRetries, err)
|
||||||
|
|
||||||
// Экспоненциальная задержка перед повторной попыткой
|
|
||||||
time.Sleep(retryDelay)
|
time.Sleep(retryDelay)
|
||||||
retryDelay *= 2
|
retryDelay *= 2
|
||||||
}
|
}
|
||||||
@ -545,8 +541,8 @@ func (s *server) runStream(ctx context.Context, req *proto.StreamMessagesRequest
|
|||||||
false, // exclusive
|
false, // exclusive
|
||||||
false, // noWait
|
false, // noWait
|
||||||
amqp.Table{
|
amqp.Table{
|
||||||
"x-message-ttl": int32(86400000), // 24 hours
|
"x-message-ttl": int32(86400000),
|
||||||
"x-expires": int32(86400000), // 24 hours
|
"x-expires": int32(86400000),
|
||||||
"x-single-active-consumer": false,
|
"x-single-active-consumer": false,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@ -568,7 +564,7 @@ func (s *server) runStream(ctx context.Context, req *proto.StreamMessagesRequest
|
|||||||
msgs, err := ch.Consume(
|
msgs, err := ch.Consume(
|
||||||
queueName,
|
queueName,
|
||||||
"", // consumer
|
"", // consumer
|
||||||
false, // auto-ack (false для ручного подтверждения)
|
false, // auto-ack
|
||||||
false, // exclusive
|
false, // exclusive
|
||||||
false, // noLocal
|
false, // noLocal
|
||||||
false, // noWait
|
false, // noWait
|
||||||
@ -588,7 +584,6 @@ func (s *server) runStream(ctx context.Context, req *proto.StreamMessagesRequest
|
|||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-keepaliveTicker.C:
|
case <-keepaliveTicker.C:
|
||||||
// Отправляем пустое сообщение как keepalive
|
|
||||||
if err := stream.Send(&proto.MessageResponse{}); err != nil {
|
if err := stream.Send(&proto.MessageResponse{}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -597,7 +592,6 @@ func (s *server) runStream(ctx context.Context, req *proto.StreamMessagesRequest
|
|||||||
return nil
|
return nil
|
||||||
case <-heartbeat.C:
|
case <-heartbeat.C:
|
||||||
s.logger.Printf("Sending heartbeat for user %d", req.UserId)
|
s.logger.Printf("Sending heartbeat for user %d", req.UserId)
|
||||||
// Send empty message as heartbeat
|
|
||||||
if err := stream.Send(&proto.MessageResponse{}); err != nil {
|
if err := stream.Send(&proto.MessageResponse{}); err != nil {
|
||||||
s.logger.Printf("Failed to send heartbeat: %v", err)
|
s.logger.Printf("Failed to send heartbeat: %v", err)
|
||||||
return err
|
return err
|
||||||
@ -612,24 +606,24 @@ func (s *server) runStream(ctx context.Context, req *proto.StreamMessagesRequest
|
|||||||
var msg proto.Message
|
var msg proto.Message
|
||||||
if err := json.Unmarshal(d.Body, &msg); err != nil {
|
if err := json.Unmarshal(d.Body, &msg); err != nil {
|
||||||
s.logger.Printf("Failed to unmarshal message: %v", err)
|
s.logger.Printf("Failed to unmarshal message: %v", err)
|
||||||
d.Nack(false, false) // Отбрасываем некорректное сообщение
|
d.Nack(false, false)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if msg.Id == 0 || msg.Content == "" {
|
if msg.Id == 0 || msg.Content == "" {
|
||||||
d.Ack(false) // Подтверждаем, но не отправляем в стрим
|
d.Ack(false)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
s.logger.Printf("Sending message to stream for user %d: %+v", req.UserId, msg)
|
s.logger.Printf("Sending message to stream for user %d: %+v", req.UserId, msg)
|
||||||
if err := stream.Send(&proto.MessageResponse{Message: &msg}); err != nil {
|
if err := stream.Send(&proto.MessageResponse{Message: &msg}); err != nil {
|
||||||
s.logger.Printf("Failed to send message to stream: %v", err)
|
s.logger.Printf("Failed to send message to stream: %v", err)
|
||||||
d.Nack(false, true) // Возвращаем в очередь при ошибке отправки
|
d.Nack(false, true)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
s.logger.Printf("Acknowledging message for user %d", req.UserId)
|
s.logger.Printf("Acknowledging message for user %d", req.UserId)
|
||||||
d.Ack(false) // Подтверждаем обработку
|
d.Ack(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user