Skip to content

Commit 5cf3cc5

Browse files
committed
Refactor in memory push queue to emulator push queue
1 parent 6028167 commit 5cf3cc5

5 files changed

Lines changed: 106 additions & 67 deletions

File tree

api/.env.production

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ GCP_PROJECT_ID=
44

55
APP_HTTP_LOGGER=
66

7+
EVENTS_QUEUE_TYPE=
78
EVENTS_QUEUE_USER_API_KEY=
89
EVENTS_QUEUE_NAME=
910
EVENTS_QUEUE_USER_ID=

api/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package main
22

33
import (
4-
"os"
54
"fmt"
5+
"os"
6+
67
_ "github.com/NdoleStudio/httpsms/docs"
78
"github.com/NdoleStudio/httpsms/pkg/di"
89
)

api/pkg/di/container.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -305,15 +305,27 @@ func (container *Container) EventsQueueConfiguration() (config services.PushQueu
305305
func (container *Container) EventsQueue() (queue services.PushQueue) {
306306
container.logger.Debug("creating events services.PushQueue")
307307

308-
if isLocal() {
309-
return services.NewInMemoryPushQueue(
310-
container.Logger(),
311-
container.Tracer(),
312-
container.EventsQueueConfiguration(),
313-
func() *services.EventDispatcher { return container.eventDispatcher },
314-
)
308+
if os.Getenv("EVENTS_QUEUE_TYPE") == "emulator" {
309+
return container.EmulatorEventsQueue()
315310
}
316311

312+
return container.CloudTaskEventsQueue()
313+
}
314+
315+
// EmulatorEventsQueue creates an in process instance of events services.PushQueue
316+
func (container *Container) EmulatorEventsQueue() (queue services.PushQueue) {
317+
container.logger.Debug("creating emulator events services.PushQueue")
318+
return services.EmulatorPushQueue(
319+
container.Logger(),
320+
container.Tracer(),
321+
container.HTTPClient("emulator_events_queue"),
322+
container.EventsQueueConfiguration(),
323+
)
324+
}
325+
326+
// CloudTaskEventsQueue creates a Google cloud task instance of events services.PushQueue
327+
func (container *Container) CloudTaskEventsQueue() (queue services.PushQueue) {
328+
container.logger.Debug("creating cloud task events services.PushQueue")
317329
return services.NewGooglePushQueue(
318330
container.Logger(),
319331
container.Tracer(),
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package services
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"net/http"
7+
"time"
8+
9+
"github.com/carlmjohnson/requests"
10+
"github.com/palantir/stacktrace"
11+
12+
"github.com/NdoleStudio/httpsms/pkg/telemetry"
13+
"github.com/google/uuid"
14+
)
15+
16+
type emulatorPushQueue struct {
17+
config PushQueueConfig
18+
client *http.Client
19+
logger telemetry.Logger
20+
tracer telemetry.Tracer
21+
}
22+
23+
// EmulatorPushQueue creates a new googlePushQueue
24+
func EmulatorPushQueue(
25+
logger telemetry.Logger,
26+
tracer telemetry.Tracer,
27+
client *http.Client,
28+
config PushQueueConfig,
29+
) PushQueue {
30+
return &emulatorPushQueue{
31+
tracer: tracer,
32+
logger: logger.WithService(fmt.Sprintf("%T", emulatorPushQueue{})),
33+
client: client,
34+
config: config,
35+
}
36+
}
37+
38+
// Enqueue a task to the queue
39+
func (queue *emulatorPushQueue) Enqueue(ctx context.Context, task *PushQueueTask, timeout time.Duration) (queueID string, err error) {
40+
ctx, span, ctxLogger := queue.tracer.StartWithLogger(ctx, queue.logger)
41+
defer span.End()
42+
43+
queueID = uuid.New().String()
44+
45+
time.AfterFunc(timeout, queue.push(*task, queueID))
46+
47+
ctxLogger.Info(fmt.Sprintf(
48+
"task added to [%s] queue with ID [%s] and scheduled at [%s]",
49+
queue.config.Name,
50+
queueID,
51+
time.Now().UTC().Add(timeout),
52+
))
53+
54+
return queueID, nil
55+
}
56+
57+
func (queue *emulatorPushQueue) push(task PushQueueTask, queueID string) func() {
58+
return func() {
59+
ctx, cancel := context.WithTimeout(context.Background(), time.Minute)
60+
defer cancel()
61+
62+
err := requests.
63+
URL(task.URL).
64+
Client(queue.client).
65+
CopyHeaders(queue.httpHeaders(task)).
66+
Method(task.Method).
67+
BodyBytes(task.Body).
68+
Fetch(ctx)
69+
if err != nil {
70+
queue.logger.Error(stacktrace.Propagate(err, fmt.Sprintf("cannot send http request to [%s] for queue task [%s]", task.URL, queueID)))
71+
return
72+
}
73+
74+
queue.logger.Info(fmt.Sprintf("queue task [%s] sent to URL [%s]", queueID, task.URL))
75+
}
76+
}
77+
78+
func (queue *emulatorPushQueue) httpHeaders(task PushQueueTask) map[string][]string {
79+
headers := map[string][]string{}
80+
for key, value := range task.Headers {
81+
headers[key] = []string{value}
82+
}
83+
return headers
84+
}

api/pkg/services/in_memory_push_queue.go

Lines changed: 0 additions & 59 deletions
This file was deleted.

0 commit comments

Comments
 (0)