shared-sqs: Этап 1 — клон GoAWS, удаление SNS, go build OK
This commit is contained in:
@@ -0,0 +1,116 @@
|
||||
package models
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
log "github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
type MessageStructure string
|
||||
type Protocol string
|
||||
|
||||
type MessageAttribute struct {
|
||||
BinaryListValues []string `json:"BinaryListValues,omitempty" xml:"BinaryListValues,omitempty"` // currently unsupported by AWS
|
||||
BinaryValue string `json:"BinaryValue,omitempty" xml:"BinaryValue,omitempty"`
|
||||
DataType string `json:"DataType,omitempty" xml:"DataType,omitempty"`
|
||||
StringListValues []string `json:"StringListValues,omitempty" xml:"StringListValues,omitempty"` // currently unsupported by AWS
|
||||
StringValue string `json:"StringValue,omitempty" xml:"StringValue,omitempty"`
|
||||
}
|
||||
|
||||
|
||||
type SqsMessage struct {
|
||||
MessageBody string
|
||||
Uuid string
|
||||
MD5OfMessageAttributes string
|
||||
MD5OfMessageBody string
|
||||
ReceiptHandle string
|
||||
ReceiptTime time.Time
|
||||
VisibilityTimeout time.Time
|
||||
NumberOfReceives int
|
||||
Retry int
|
||||
MessageAttributes map[string]MessageAttribute
|
||||
GroupID string
|
||||
DeduplicationID string
|
||||
SentTime time.Time
|
||||
DelaySecs int
|
||||
}
|
||||
|
||||
func (m *SqsMessage) IsReadyForReceipt() bool {
|
||||
randomLatency, err := generateRandomLatency()
|
||||
if err != nil {
|
||||
log.Error(err)
|
||||
return true
|
||||
}
|
||||
showAt := m.SentTime.Add(randomLatency).Add(time.Duration(m.DelaySecs) * time.Second)
|
||||
return showAt.Before(time.Now())
|
||||
}
|
||||
|
||||
type Queue struct {
|
||||
Name string
|
||||
URL string
|
||||
Arn string
|
||||
VisibilityTimeout int // seconds
|
||||
ReceiveMessageWaitTimeSeconds int
|
||||
DelaySeconds int
|
||||
MaximumMessageSize int
|
||||
MessageRetentionPeriod int // seconds // TODO - not used in the code yet
|
||||
Messages []SqsMessage
|
||||
DeadLetterQueue *Queue
|
||||
MaxReceiveCount int
|
||||
IsFIFO bool
|
||||
FIFOMessages map[string]int
|
||||
FIFOSequenceNumbers map[string]int
|
||||
EnableDuplicates bool
|
||||
Duplicates map[string]time.Time
|
||||
}
|
||||
|
||||
func (q *Queue) NextSequenceNumber(groupId string) string {
|
||||
if _, ok := q.FIFOSequenceNumbers[groupId]; !ok {
|
||||
q.FIFOSequenceNumbers = map[string]int{
|
||||
groupId: 0,
|
||||
}
|
||||
}
|
||||
|
||||
q.FIFOSequenceNumbers[groupId]++
|
||||
return strconv.Itoa(q.FIFOSequenceNumbers[groupId])
|
||||
}
|
||||
|
||||
func (q *Queue) IsLocked(groupId string) bool {
|
||||
_, ok := q.FIFOMessages[groupId]
|
||||
return ok
|
||||
}
|
||||
|
||||
func (q *Queue) LockGroup(groupId string) {
|
||||
if _, ok := q.FIFOMessages[groupId]; !ok {
|
||||
q.FIFOMessages = map[string]int{
|
||||
groupId: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (q *Queue) UnlockGroup(groupId string) {
|
||||
if _, ok := q.FIFOMessages[groupId]; ok {
|
||||
delete(q.FIFOMessages, groupId)
|
||||
}
|
||||
}
|
||||
|
||||
func (q *Queue) IsDuplicate(deduplicationId string) bool {
|
||||
if !q.EnableDuplicates || !q.IsFIFO || deduplicationId == "" {
|
||||
return false
|
||||
}
|
||||
|
||||
_, ok := q.Duplicates[deduplicationId]
|
||||
|
||||
return ok
|
||||
}
|
||||
|
||||
func (q *Queue) InitDuplicatation(deduplicationId string) {
|
||||
if !q.EnableDuplicates || !q.IsFIFO || deduplicationId == "" {
|
||||
return
|
||||
}
|
||||
|
||||
if _, ok := q.Duplicates[deduplicationId]; !ok {
|
||||
q.Duplicates[deduplicationId] = time.Now()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user