【Hasura】Cloud RunでSubscriptionは使えるのか検証してみた

こんにちは、フリーランスエンジニアの太田雅昭です。

HasuraのSubscription

Hasuraの目玉機能の一つにSubscriptionがあります。これはデータベースの変更を検知して、通知してくれるというすぐれものです。自前でsocketを書く必要もないので、とても便利です。

しかしこれをCloudRunで使えるのかどうかがはっきり分かりません。CloudRunではアイドル状態のインスタンスは一定時間が経つと破棄されてしまいます。それがリクエストの有無なのか、あるいはHasuraのようなリッスンではどうなのか、などわからなかったため、検証してみました。

検証方法

検証には以下のコードを用いました。

const Uri = `wss://example.com/v1/graphql`;
const OutputPath = 'output.txt';
const UpdateSql = 'UPDATE "xxx" SET "updatedAt"=NOW() WHERE id=1';
const SubscribeQuery = SubscribeTestToAuction;
const SubscribeVariables = { id: 1 };

const DbHost = '127.0.0.1';
const DbPort = 1234;
const DbUser = process.env.DATABASE_USER;
const DbPass = process.env.DATABASE_PASS;
const DbName = process.env.DATABASE_NAME;

let pg: Client;
let apollo: ApolloClient<any>;
let cnt = 0;

async function main() {
    await initPg();
    await initApollo();
    await update();
}

async function initPg() {
    pg = new Client({
        host: DbHost,
        port: DbPort,
        user: DbUser,
        password: DbPass,
        database: DbName,
    });
    await pg.connect();
}

async function initApollo() {
    const wsLink = new WebSocketLink({
        webSocketImpl: ws,
        uri: Uri,
        options: {
            reconnect: true,
        },
    });

    apollo = new ApolloClient({
        cache: new InMemoryCache(),
        link: from([wsLink]),
    });

    apollo
        .subscribe({ query: SubscribeQuery, variables: SubscribeVariables })
        .subscribe({
            next: (data) => {
                const updatedAt = data.data?.xxx_by_pk?.updatedAt;
                output(++cnt + ' ' + dayjs(updatedAt).format('HH:mm:ss'));
                setTimeout(update, 1000);
            },
            error: (error) => {
                output(error);
            },
        });
}

async function update() {
    const res = await pg.query(UpdateSql);
}

function output(str: string) {
    console.log(str);
    fs.appendFileSync(OutputPath, str + '\n');
}

main();

内容は、CloudRun上のHasuraからSubscribeして、通知を受け取ったら1秒後にデータベースを更新、また通知を受け取るということを繰り返しています。その時刻をファイルとコンソールに出力しています。

結果

15分と少し回し続けた結果、以下のようになりました。

1 07:48:54
2 07:48:55
3 07:48:57
4 07:48:59
5 07:49:01
6 07:49:03
7 07:49:05
8 07:49:07
9 07:49:09
10 07:49:11
11 07:49:14
12 07:49:15
13 07:49:17
14 07:49:19
15 07:49:21
16 07:49:23
17 07:49:25
18 07:49:27
19 07:49:29
20 07:49:31
21 07:49:33
22 07:49:35
23 07:49:37
24 07:49:39
25 07:49:41
26 07:49:43
27 07:49:45
28 07:49:47
29 07:49:49
30 07:49:51
31 07:49:53
32 07:49:55
33 07:49:57
34 07:49:59
35 07:50:01
36 07:50:03
37 07:50:05
38 07:50:07
39 07:50:10
40 07:50:11
41 07:50:14
42 07:50:15
43 07:50:18
44 07:50:20
45 07:50:22
46 07:50:23
47 07:50:25
48 07:50:27
49 07:50:29
50 07:50:31
51 07:50:34
52 07:50:35
53 07:50:37
54 07:50:40
55 07:50:42
56 07:50:44
57 07:50:46
58 07:50:48
59 07:50:50
60 07:50:52
61 07:50:54
62 07:50:56
63 07:50:58
64 07:51:00
65 07:51:02
66 07:51:04
67 07:51:06
68 07:51:08
69 07:51:10
70 07:51:12
71 07:51:14
72 07:51:16
73 07:51:18
74 07:51:20
75 07:51:22
76 07:51:24
77 07:51:26
78 07:51:28
79 07:51:30
80 07:51:32
81 07:51:34
82 07:51:36
83 07:51:38
84 07:51:40
85 07:51:42
86 07:51:44
87 07:51:46
88 07:51:48
89 07:51:50
90 07:51:52
91 07:51:54
92 07:51:56
93 07:51:58
94 07:52:00
95 07:52:02
96 07:52:04
97 07:52:06
98 07:52:08
99 07:52:10
100 07:52:12
101 07:52:14
102 07:52:16
103 07:52:18
104 07:52:20
105 07:52:22
106 07:52:24
107 07:52:26
108 07:52:28
109 07:52:30
110 07:52:32
111 07:52:34
112 07:52:36
113 07:52:38
114 07:52:40
115 07:52:42
116 07:52:44
117 07:52:46
118 07:52:48
119 07:52:50
120 07:52:52
121 07:52:54
122 07:52:56
123 07:52:58
124 07:53:00
125 07:53:02
126 07:53:04
127 07:53:06
128 07:53:08
129 07:53:10
130 07:53:12
131 07:53:14
132 07:53:16
133 07:53:18
134 07:53:20
135 07:53:22
136 07:53:24
137 07:53:26
138 07:53:28
139 07:53:30
140 07:53:32
141 07:53:34
142 07:53:36
143 07:53:38
144 07:53:40
145 07:53:42
146 07:53:44
147 07:53:46
148 07:53:48
149 07:53:50
150 07:53:52
151 07:53:54
152 07:53:54
153 07:53:56
154 07:53:57
155 07:53:58
156 07:53:59
157 07:54:00
158 07:54:01
159 07:54:02
160 07:54:03
161 07:54:04
162 07:54:05
163 07:54:06
164 07:54:07
165 07:54:08
166 07:54:09
167 07:54:10
168 07:54:11
169 07:54:12
170 07:54:13
171 07:54:14
172 07:54:15
173 07:54:16
174 07:54:17
175 07:54:18
176 07:54:19
177 07:54:20
178 07:54:21
179 07:54:22
180 07:54:23
181 07:54:24
182 07:54:25
183 07:54:26
184 07:54:27
185 07:54:28
186 07:54:29
187 07:54:30
188 07:54:31
189 07:54:32
190 07:54:33
191 07:54:34
192 07:54:35
193 07:54:36
194 07:54:37
195 07:54:38
196 07:54:39
197 07:54:40
198 07:54:41
199 07:54:42
200 07:54:43
201 07:54:44
202 07:54:45
203 07:54:46
204 07:54:47
205 07:54:48
206 07:54:49
207 07:54:50
208 07:54:51
209 07:54:52
210 07:54:53
211 07:54:54
212 07:54:55
213 07:54:56
214 07:54:57
215 07:54:58
216 07:54:59
217 07:55:00
218 07:55:01
219 07:55:02
220 07:55:03
221 07:55:04
222 07:55:05
223 07:55:06
224 07:55:07
225 07:55:08
226 07:55:09
227 07:55:10
228 07:55:11
229 07:55:12
230 07:55:13
231 07:55:14
232 07:55:15
233 07:55:16
234 07:55:17
235 07:55:18
236 07:55:19
237 07:55:20
238 07:55:21
239 07:55:22
240 07:55:23
241 07:55:24
242 07:55:25
243 07:55:26
244 07:55:27
245 07:55:28
246 07:55:29
247 07:55:30
248 07:55:31
249 07:55:32
250 07:55:33
251 07:55:34
252 07:55:35
253 07:55:36
254 07:55:37
255 07:55:38
256 07:55:39
257 07:55:40
258 07:55:41
259 07:55:42
260 07:55:43
261 07:55:44
262 07:55:45
263 07:55:46
264 07:55:47
265 07:55:48
266 07:55:49
267 07:55:50
268 07:55:51
269 07:55:52
270 07:55:53
271 07:55:54
272 07:55:55
273 07:55:56
274 07:55:57
275 07:55:58
276 07:55:59
277 07:56:00
278 07:56:01
279 07:56:02
280 07:56:03
281 07:56:04
282 07:56:05
283 07:56:06
284 07:56:07
285 07:56:08
286 07:56:09
287 07:56:10
288 07:56:11
289 07:56:12
290 07:56:13
291 07:56:14
292 07:56:15
293 07:56:16
294 07:56:17
295 07:56:18
296 07:56:19
297 07:56:20
298 07:56:21
299 07:56:22
300 07:56:23
301 07:56:24
302 07:56:25
303 07:56:26
304 07:56:27
305 07:56:28
306 07:56:29
307 07:56:30
308 07:56:31
309 07:56:32
310 07:56:33
311 07:56:34
312 07:56:35
313 07:56:36
314 07:56:37
315 07:56:38
316 07:56:39
317 07:56:40
318 07:56:41
319 07:56:42
320 07:56:43
321 07:56:44
322 07:56:45
323 07:56:46
324 07:56:47
325 07:56:48
326 07:56:49
327 07:56:50
328 07:56:51
329 07:56:52
330 07:56:53
331 07:56:54
332 07:56:55
333 07:56:56
334 07:56:57
335 07:56:58
336 07:56:59
337 07:57:00
338 07:57:01
339 07:57:02
340 07:57:03
341 07:57:04
342 07:57:05
343 07:57:06
344 07:57:07
345 07:57:08
346 07:57:09
347 07:57:10
348 07:57:11
349 07:57:12
350 07:57:13
351 07:57:14
352 07:57:15
353 07:57:16
354 07:57:17
355 07:57:18
356 07:57:19
357 07:57:20
358 07:57:21
359 07:57:22
360 07:57:23
361 07:57:24
362 07:57:25
363 07:57:26
364 07:57:27
365 07:57:28
366 07:57:29
367 07:57:30
368 07:57:31
369 07:57:32
370 07:57:33
371 07:57:34
372 07:57:35
373 07:57:36
374 07:57:37
375 07:57:38
376 07:57:39
377 07:57:40
378 07:57:41
379 07:57:42
380 07:57:43
381 07:57:44
382 07:57:45
383 07:57:46
384 07:57:47
385 07:57:48
386 07:57:49
387 07:57:50
388 07:57:51
389 07:57:52
390 07:57:53
391 07:57:54
392 07:57:55
393 07:57:56
394 07:57:57
395 07:57:58
396 07:57:59
397 07:58:00
398 07:58:01
399 07:58:02
400 07:58:03
401 07:58:04
402 07:58:05
403 07:58:06
404 07:58:07
405 07:58:08
406 07:58:09
407 07:58:10
408 07:58:11
409 07:58:12
410 07:58:13
411 07:58:14
412 07:58:15
413 07:58:16
414 07:58:17
415 07:58:18
416 07:58:19
417 07:58:20
418 07:58:21
419 07:58:22
420 07:58:23
421 07:58:24
422 07:58:25
423 07:58:26
424 07:58:27
425 07:58:28
426 07:58:29
427 07:58:30
428 07:58:31
429 07:58:32
430 07:58:33
431 07:58:34
432 07:58:35
433 07:58:36
434 07:58:37
435 07:58:38
436 07:58:39
437 07:58:40
438 07:58:41
439 07:58:42
440 07:58:43
441 07:58:44
442 07:58:45
443 07:58:46
444 07:58:47
445 07:58:48
446 07:58:49
447 07:58:50
448 07:58:51
449 07:58:52
450 07:58:53
451 07:58:54
452 07:58:55
453 07:58:56
454 07:58:57
455 07:58:58
456 07:58:59
457 07:59:00
458 07:59:01
459 07:59:02
460 07:59:03
461 07:59:04
462 07:59:05
463 07:59:06
464 07:59:07
465 07:59:08
466 07:59:09
467 07:59:10
468 07:59:11
469 07:59:12
470 07:59:13
471 07:59:14
472 07:59:15
473 07:59:16
474 07:59:17
475 07:59:18
476 07:59:19
477 07:59:20
478 07:59:21
479 07:59:22
480 07:59:23
481 07:59:24
482 07:59:25
483 07:59:26
484 07:59:27
485 07:59:28
486 07:59:29
487 07:59:30
488 07:59:31
489 07:59:32
490 07:59:33
491 07:59:34
492 07:59:35
493 07:59:36
494 07:59:37
495 07:59:38
496 07:59:39
497 07:59:40
498 07:59:41
499 07:59:42
500 07:59:43
501 07:59:44
502 07:59:45
503 07:59:46
504 07:59:47
505 07:59:48
506 07:59:49
507 07:59:50
508 07:59:51
509 07:59:52
510 07:59:53
511 07:59:54
512 07:59:55
513 07:59:56
514 07:59:57
515 07:59:58
516 07:59:59
517 08:00:00
518 08:00:01
519 08:00:02
520 08:00:03
521 08:00:04
522 08:00:05
523 08:00:06
524 08:00:07
525 08:00:08
526 08:00:09
527 08:00:10
528 08:00:11
529 08:00:12
530 08:00:13
531 08:00:14
532 08:00:15
533 08:00:16
534 08:00:17
535 08:00:18
536 08:00:19
537 08:00:20
538 08:00:21
539 08:00:22
540 08:00:23
541 08:00:24
542 08:00:25
543 08:00:26
544 08:00:27
545 08:00:28
546 08:00:29
547 08:00:30
548 08:00:31
549 08:00:32
550 08:00:33
551 08:00:34
552 08:00:35
553 08:00:36
554 08:00:37
555 08:00:38
556 08:00:39
557 08:00:40
558 08:00:41
559 08:00:42
560 08:00:43
561 08:00:44
562 08:00:45
563 08:00:46
564 08:00:47
565 08:00:48
566 08:00:49
567 08:00:50
568 08:00:51
569 08:00:52
570 08:00:53
571 08:00:54
572 08:00:55
573 08:00:56
574 08:00:57
575 08:00:58
576 08:00:59
577 08:01:00
578 08:01:01
579 08:01:02
580 08:01:03
581 08:01:04
582 08:01:05
583 08:01:06
584 08:01:07
585 08:01:08
586 08:01:09
587 08:01:10
588 08:01:11
589 08:01:12
590 08:01:13
591 08:01:14
592 08:01:15
593 08:01:16
594 08:01:17
595 08:01:18
596 08:01:19
597 08:01:20
598 08:01:21
599 08:01:22
600 08:01:23
601 08:01:24
602 08:01:25
603 08:01:26
604 08:01:27
605 08:01:28
606 08:01:29
607 08:01:30
608 08:01:31
609 08:01:32
610 08:01:33
611 08:01:34
612 08:01:35
613 08:01:36
614 08:01:37
615 08:01:38
616 08:01:39
617 08:01:40
618 08:01:41
619 08:01:42
620 08:01:43
621 08:01:44
622 08:01:45
623 08:01:46
624 08:01:47
625 08:01:48
626 08:01:49
627 08:01:50
628 08:01:51
629 08:01:52
630 08:01:53
631 08:01:54
632 08:01:55
633 08:01:56
634 08:01:57
635 08:01:58
636 08:01:59
637 08:02:00
638 08:02:01
639 08:02:02
640 08:02:03
641 08:02:04
642 08:02:05
643 08:02:06
644 08:02:07
645 08:02:08
646 08:02:09
647 08:02:10
648 08:02:11
649 08:02:12
650 08:02:13
651 08:02:14
652 08:02:15
653 08:02:16
654 08:02:17
655 08:02:18
656 08:02:19
657 08:02:20
658 08:02:21
659 08:02:22
660 08:02:23
661 08:02:24
662 08:02:25
663 08:02:26
664 08:02:27
665 08:02:28
666 08:02:29
667 08:02:30
668 08:02:31
669 08:02:32
670 08:02:33
671 08:02:34
672 08:02:35
673 08:02:36
674 08:02:37
675 08:02:38
676 08:02:39
677 08:02:40
678 08:02:41
679 08:02:42
680 08:02:43
681 08:02:44
682 08:02:45
683 08:02:46
684 08:02:47
685 08:02:48
686 08:02:49
687 08:02:50
688 08:02:51
689 08:02:52
690 08:02:53
691 08:02:54
692 08:02:55
693 08:02:56
694 08:02:57
695 08:02:58
696 08:02:59
697 08:03:00
698 08:03:01
699 08:03:02
700 08:03:03
701 08:03:04
702 08:03:05
703 08:03:06
704 08:03:08
705 08:03:10
706 08:03:12
707 08:03:14
708 08:03:16
709 08:03:18
710 08:03:20
711 08:03:22
712 08:03:24
713 08:03:26
714 08:03:28
715 08:03:30
716 08:03:32
717 08:03:34
718 08:03:36
719 08:03:38
720 08:03:40
721 08:03:42
722 08:03:44
723 08:03:46
724 08:03:48
725 08:03:50
726 08:03:52
727 08:03:54
728 08:03:56
729 08:03:58
730 08:03:59
731 08:04:01
732 08:04:03
733 08:04:05
734 08:04:07
735 08:04:09
736 08:04:11
737 08:04:13
738 08:04:15
739 08:04:17
740 08:04:19
741 08:04:21
742 08:04:23
743 08:04:25
744 08:04:27
745 08:04:29
746 08:04:31
747 08:04:33
748 08:04:35
749 08:04:37
750 08:04:39
751 08:04:41
752 08:04:43
753 08:04:45
754 08:04:47
755 08:04:49
756 08:04:51
757 08:04:53
758 08:04:55
759 08:04:57
760 08:04:59
761 08:05:01
762 08:05:03
763 08:05:05
764 08:05:07
765 08:05:09
766 08:05:11
767 08:05:13
768 08:05:15
769 08:05:17
770 08:05:19
771 08:05:22
772 08:05:23
773 08:05:25
774 08:05:27
775 08:05:29
776 08:05:32
777 08:05:33
778 08:05:35
779 08:05:37
780 08:05:40
781 08:05:41
782 08:05:44
783 08:05:45
784 08:05:47
785 08:05:50
786 08:05:51
787 08:05:53
788 08:05:55
789 08:05:58
790 08:05:59
791 08:06:02
792 08:06:04
793 08:06:05
794 08:06:07
795 08:06:09
796 08:06:11
797 08:06:14
798 08:06:15
799 08:06:18
800 08:06:19
801 08:06:22
802 08:06:23
803 08:06:25
804 08:06:27
805 08:06:30
806 08:06:32
807 08:06:34
808 08:06:36
809 08:06:38
810 08:06:40
811 08:06:42
812 08:06:44
813 08:06:46
814 08:06:48
815 08:06:50
816 08:06:52

間隔にばらつきがありますが、CloudSQLに共用のものを使っているためと思われます。軽い時は1秒間隔、重い時でも3秒とかですね。おおむね、問題ないかと思います。

なお最小インスタンス数は0に設定していました。また、この検証中のインスタンス数はつねに1で、思惑通りとなっています。

CloudRunでHasuraのサブスクリプションを使うのは、問題なさそうですね。

小話

昔はよくわからず、味の素はダメだと思ってましたが、原材料はただのサトウキビだそうですね。私は美味しいものが好きなので、味の素大好きです。なおお店をしていた頃は、味の素の代わりに昆布茶粉末を使っていましたが、まぁそちらの方がクリーンなイメージがありますね。