From 4e4d45128e1f88d28ce8c7dfeac40abbd76e156c Mon Sep 17 00:00:00 2001 From: tanaka Date: Sat, 31 Aug 2024 19:38:19 +0900 Subject: [PATCH 1/6] Add Japanese translation for advanced/queues.md --- docs/advanced/queues.ja.md | 446 +++++++++++++++++++++++++++++++++++++ 1 file changed, 446 insertions(+) create mode 100644 docs/advanced/queues.ja.md diff --git a/docs/advanced/queues.ja.md b/docs/advanced/queues.ja.md new file mode 100644 index 000000000..a24dabbe9 --- /dev/null +++ b/docs/advanced/queues.ja.md @@ -0,0 +1,446 @@ +# Queues + +Vapor Queues ([vapor/queues](https://github.com/vapor/queues)) は、タスクの責任をサイドワーカーに譲渡することができる、純粋なSwiftのキューシステムです。 + +このパッケージが適しているタスクの例: + +- メインのリクエストスレッド外でのメール送信 +- 複雑または長時間かかるデータベース操作の実行 +- ジョブの整合性と耐障害性の確保 +- 非クリティカルな処理を遅らせることによる応答時間の短縮 +- 特定の時間にジョブをスケジュール + +このパッケージは [Ruby Sidekiq](https://github.com/mperham/sidekiq) に似ており、以下の機能を提供します: + +- シャットダウン、再起動、または新しいデプロイを示すためにホスティングプロバイダーから送信される`SIGTERM`および`SIGINT`シグナルの安全な処理。 +- 異なる優先度が付いたキュー。例えば、メールキューで実行するジョブとデータ処理キューで実行するジョブの優先度を指定できます。 +- 予期しない障害に対処するための信頼性の高いキュープロセスの実装。 +- 指定された回数までジョブを成功するまで繰り返す`maxRetryCount`機能を含む。 +- NIOを使用して、利用可能なすべてのコアとEventLoopをジョブに活用。 +- 定期実行処理をスケジュールする機能を提供。 + +Queuesには、メインプロトコルとインターフェースする正式にサポートされているドライバが1つあります: + +- [QueuesRedisDriver](https://github.com/vapor/queues-redis-driver) + +また、コミュニティベースのドライバもあります: +- [QueuesMongoDriver](https://github.com/vapor-community/queues-mongo-driver) +- [QueuesFluentDriver](https://github.com/m-barthelemy/vapor-queues-fluent-driver) + +!!! tip + `vapor/queues`パッケージは、ドライバを新規に構築している場合を除き、直接依存パッケージに追加しないでください。代わりにドライバパッケージのいずれかを追加してください。 + +## Getting Started + +Queuesの使用を開始する方法を見てみましょう。 + +### Package + +Queuesを使用するための最初のステップは、SwiftPMパッケージのマニフェストファイルに依存関係としてドライバの1つを追加することです。この例では、Redisドライバを使用します。 + +```swift +// swift-tools-version:5.8 +import PackageDescription + +let package = Package( + name: "MyApp", + dependencies: [ + /// 他の依存関係... + .package(url: "https://github.com/vapor/queues-redis-driver.git", from: "1.0.0"), + ], + targets: [ + .executableTarget(name: "App", dependencies: [ + // 他の依存関係 + .product(name: "QueuesRedisDriver", package: "queues-redis-driver") + ]), + .testTarget(name: "AppTests", dependencies: [.target(name: "App")]), + ] +) +``` + +Xcode内でマニフェストを直接編集した場合、ファイルを保存すると自動的に変更を検出し、新しい依存関係を取得します。それ以外の場合は、ターミナルから`swift package resolve`を実行して新しい依存関係を取得します。 + +### Config + +次のステップは、`configure.swift`でQueuesを設定することです。ここでは、Redisライブラリを例として使用します: + +```swift +import QueuesRedisDriver + +try app.queues.use(.redis(url: "redis://127.0.0.1:6379")) +``` + +### Registering a `Job` + +ジョブをモデリングした後、次のようにconfigurationセクションに追加する必要があります: + +```swift +//ジョブを登録 +let emailJob = EmailJob() +app.queues.add(emailJob) +``` + +### Running Workers as Processes + +新しいキューワーカーを開始するには、`swift run App queues`を実行します。特定の種類のワーカーを実行する場合は、`swift run App queues --queue emails`と指定することもできます。 + +!!! tip + ワーカーは本番環境で実行し続ける必要があります。長時間実行するプロセスを維持する方法については、ホスティングプロバイダーに従ってください。例えば、Herokuでは、Procfileに`worker: Run queues`のように"worker" dynoを指定できます。これを設定すると、ダッシュボードのリソースタブや`heroku ps:scale worker=1`(または任意のdyno数)でワーカーを開始できます。 + +### Running Workers in-process + +アプリケーションと同じプロセスでワーカーを実行するには(別のサーバーを起動して処理する代わりに)、`Application`の便利なメソッドを呼び出します: + +```swift +try app.queues.startInProcessJobs(on: .default) +``` + +スケジュールされたジョブをプロセス内で実行するには、次のメソッドを呼び出します: + +```swift +try app.queues.startScheduledJobs() +``` + +!!! warning + キューワーカーをコマンドラインまたはプロセス内ワーカー経由で起動しない場合、ジョブはディスパッチされません。 + +## The `Job` Protocol + +ジョブは`Job`または`AsyncJob`プロトコルで定義されます。 + +### Modeling a `Job` object: + +```swift +import Vapor +import Foundation +import Queues + +struct Email: Codable { + let to: String + let message: String +} + +struct EmailJob: Job { + typealias Payload = Email + + func dequeue(_ context: QueueContext, _ payload: Email) -> EventLoopFuture { + // ここでメールを送信します + return context.eventLoop.future() + } + + func error(_ context: QueueContext, _ error: Error, _ payload: Email) -> EventLoopFuture { + // エラーを処理しない場合は単にfutureを返すことができます。また、この関数を完全に省略することもできます。 + return context.eventLoop.future() + } +} +``` + +`async`/`await`を使用する場合は、`AsyncJob`を使用します: + +```swift +struct EmailJob: AsyncJob { + typealias Payload = Email + + func dequeue(_ context: QueueContext, _ payload: Email) async throws { + // ここでメールを送信します + } + + func error(_ context: QueueContext, _ error: Error, _ payload: Email) async throws { + // エラーを処理しない場合は単にreturnします。また、この関数を完全に省略することもできます。 + } +} +``` +!!! info + `Payload`型が`Codable`プロトコルを実装していることを確認してください。 +!!! tip + **Getting Started**の指示に従って、このジョブを設定ファイルに追加することを忘れないでください。 + +## Dispatching Jobs + +キュージョブをディスパッチするには、`Application`または`Request`のインスタンスにアクセスする必要があります。ジョブをディスパッチするのは主にルートハンドラー内になるでしょう: + +```swift +app.get("email") { req -> EventLoopFuture in + return req + .queue + .dispatch( + EmailJob.self, + .init(to: "email@email.com", message: "message") + ).map { "done" } +} + +// or + +app.get("email") { req async throws -> String in + try await req.queue.dispatch( + EmailJob.self, + .init(to: "email@email.com", message: "message")) + return "done" +} +``` + +`Request`オブジェクトが利用できないコンテキスト(例えば`Command`内)でジョブをディスパッチする必要がある場合は、`Application`オブジェクト内の`queues`プロパティを使用する必要があります。次のようにします: + +```swift +struct SendEmailCommand: AsyncCommand { + func run(using context: CommandContext, signature: Signature) async throws { + context + .application + .queues + .queue + .dispatch( + EmailJob.self, + .init(to: "email@email.com", message: "message") + ) + } +} +``` + + +### Setting `maxRetryCount` + +`maxRetryCount`を指定した場合、エラーが発生するとジョブは自動的に再試行されます。例えば: + +```swift +app.get("email") { req -> EventLoopFuture in + return req + .queue + .dispatch( + EmailJob.self, + .init(to: "email@email.com", message: "message"), + maxRetryCount: 3 + ).map { "done" } +} + +// or + +app.get("email") { req async throws -> String in + try await req.queue.dispatch( + EmailJob.self, + .init(to: "email@email.com", message: "message"), + maxRetryCount: 3) + return "done" +} +``` + +### Specifying a delay + +ジョブを指定した`Date`が経過してからのみ実行するように設定できます。遅延を指定するには、`dispatch`の`delayUntil`パラメータに`Date`を渡します: + +```swift +app.get("email") { req async throws -> String in + let futureDate = Date(timeIntervalSinceNow: 60 * 60 * 24) // 1日後 + try await req.queue.dispatch( + EmailJob.self, + .init(to: "email@email.com", message: "message"), + maxRetryCount: 3, + delayUntil: futureDate) + return "done" +} +``` + +ジョブが`delay`パラメータの前にデキューされた場合、ドライバによってジョブが再キューされます。 + +### Specify a priority + +ジョブは必要に応じて異なるキュータイプ/プライオリティに分類できます。例えば、`email`キューと`background-processing`キューを開いてジョブを分類したい場合があります。 + +まず`QueueName`を拡張します: + +```swift +extension QueueName { + static let emails = QueueName(string: "emails") +} +``` + +次に、`jobs`オブジェクトを取得する際にキュータイプを指定します: + +```swift +app.get("email") { req -> EventLoopFuture in + let futureDate = Date(timeIntervalSinceNow: 60 * 60 * 24) // 1日後 + return req + .queues(.emails) + .dispatch( + EmailJob.self, + .init(to: "email@email.com", message: "message"), + maxRetryCount: 3, + delayUntil: futureDate + ).map { "done" } +} + +// or + +app.get("email") { req async throws -> String in + let futureDate = Date(timeIntervalSinceNow: 60 * 60 * 24) // 1日後 + try await req + .queues(.emails) + .dispatch( + EmailJob.self, + .init(to: "email@email.com", message: "message"), + maxRetryCount: 3, + delayUntil: futureDate + ) + return "done" +} +``` + +`Application`オブジェクト内からアクセスする場合は、次のようにします: + +```swift +struct SendEmailCommand: AsyncCommand { + func run(using context: CommandContext, signature: Signature) async throws { + context + .application + .queues + .queue(.emails) + .dispatch( + EmailJob.self, + .init(to: "email@email.com", message: "message"), + maxRetryCount: 3, + delayUntil: futureDate + ) + } +} +``` + + + +キューを指定しない場合、ジョブは`default`キューで実行されます。各キュータイプのワーカーを起動する手順については、**Getting Started** の指示に従ってください。 + +## Scheduling Jobs + +Queuesパッケージは、ジョブを特定の時点にスケジュールすることもできます。 + +!!! warning + スケジュールされたジョブは、アプリケーションの起動前に`configure.swift`などで設定する必要があります。ルートハンドラー内では動作しません。 + +### Starting the scheduler worker +スケジューラには、キューワーカーと同様に、別のワーカープロセスが必要です。このコマンドを実行してワーカーを起動できます: + +```sh +swift run App queues --scheduled +``` + +!!! tip + ワーカーは本番環境で実行し続ける必要があります。長時間実行するプロセスを維持する方法については、ホスティングプロバイダーに従ってください。例えば、Herokuでは、Procfileに`worker: App queues --scheduled`と指定することで「worker」dynoを指定できます。 + +### Creating a `ScheduledJob` + +まず、新しい`ScheduledJob`または`AsyncScheduledJob`を作成します: + +```swift +import Vapor +import Queues + +struct CleanupJob: ScheduledJob { + // 追加のサービスが必要な場合は、依存性注入を使用してここに追加します。 + + func run(context: QueueContext) -> EventLoopFuture { + // ここで何か作業を行い、別のジョブをキューに入れるなどします。 + return context.eventLoop.makeSucceededFuture(()) + } +} + +struct CleanupJob: AsyncScheduledJob { + // 追加のサービスが必要な場合は、依存性注入を使用してここに追加します。 + + func run(context: QueueContext) async throws { + // ここで何か作業を行い、別のジョブをキューに入れるなどします。 + } +} +``` + +次に、設定コード内でスケジュールされたジョブを登録します: + +```swift +app.queues.schedule(CleanupJob()) + .yearly() + .in(.may) + .on(23) + .at(.noon) +``` + +上記の例では、ジョブは毎年5月23日の12:00 PMに実行されます。 + +!!! tip + スケジューラはサーバーのタイムゾーンを考慮します。 + +### Available builder methods +スケジューラには5つの主なメソッドがあり、それぞれがさらにヘルパーメソッドを含むビルダーオブジェクトを作成します。コンパイラが未使用の結果に関する警告を出さなくなるまで、スケジューラオブジェクトを構築し続けます。利用可能なすべてのメソッドは以下のとおりです: + +| ヘルパー関数 | 利用可能な修飾子 | 説明 | +|--------------|--------------------------------------------------------------|-------------------------------------------| +| `yearly()` | `in(_ month: Month) -> Monthly` | ジョブを実行する月。さらに構築するための`Monthly`オブジェクトを返します。 | +| `monthly()` | `on(_ day: Day) -> Daily` | ジョブを実行する日。さらに構築するための`Daily`オブジェクトを返します。 | +| `weekly()` | `on(_ weekday: Weekday) -> Daily` | ジョブを実行する曜日。`Daily`オブジェクトを返します。 | +| `daily()` | `at(_ time: Time)` | ジョブを実行する時間。チェーンの最終メソッド。 | +| | `at(_ hour: Hour24, _ minute: Minute)` | ジョブを実行する時間と分。チェーンの最終メソッド。 | +| | `at(_ hour: Hour12, _ minute: Minute, _ period: HourPeriod)` | 実行する時間、分、時間帯。チェーンの最終メソッド。 | +| `hourly()` | `at(_ minute: Minute)` | 実行する分。チェーンの最終メソッド。 | +| `minutely()` | `at(_ second: Second)` | 実行する秒。チェーンの最終メソッド。 | + +### Available helpers +Queuesには、スケジューリングを容易にするためのいくつかのヘルパーenumが付属しています: + +| ヘルパー関数 | 利用可能なヘルパーenum | +|-------------|--------------------------------------| +| `yearly()` | `.january`,`.february`,`.march`, ... | +| `monthly()` | `.first`,`.last`,`.exact(1)` | +| `weekly()` | `.sunday`,`.monday`,`.tuesday`, ... | +| `daily()` | `.midnight`,`.noon` | + +ヘルパーenumを使用するには、ヘルパー関数の適切な修飾子を呼び出し、値を渡します。例えば: + +```swift +// 毎年1月 +.yearly().in(.january) + +// 毎月1日 +.monthly().on(.first) + +// 毎週日曜日 +.weekly().on(.sunday) + +// 毎日深夜 +.daily().at(.midnight) +``` + +## Event Delegates +Queuesパッケージでは、ワーカーがジョブに対してアクションを取ったときに通知を受け取る`JobEventDelegate`オブジェクトを指定することができます。これは、モニタリング、インサイトの表示、またはアラートの目的で使用できます。 + +始めるには、オブジェクトを`JobEventDelegate`に準拠させ、必要なメソッドを実装します: + +```swift +struct MyEventDelegate: JobEventDelegate { + /// ジョブがルートからキューワーカーにディスパッチされたときに呼び出されます + func dispatched(job: JobEventData, eventLoop: EventLoop) -> EventLoopFuture { + eventLoop.future() + } + + /// ジョブが処理キューに置かれ、作業が開始されたときに呼び出されます + func didDequeue(jobId: String, eventLoop: EventLoop) -> EventLoopFuture { + eventLoop.future() + } + + /// ジョブが処理を完了し、キューから削除されたときに呼び出されます + func success(jobId: String, eventLoop: EventLoop) -> EventLoopFuture { + eventLoop.future() + } + + /// ジョブが処理を完了したがエラーが発生したときに呼び出されます + func error(jobId: String, error: Error, eventLoop: EventLoop) -> EventLoopFuture { + eventLoop.future() + } +} +``` + +次に、設定ファイルに追加します: + +```swift +app.queues.add(MyEventDelegate()) +``` + +キューワーカーに関する追加のインサイトを提供するために、デリゲート機能を使用するサードパーティパッケージがいくつかあります: + +- [QueuesDatabaseHooks](https://github.com/vapor-community/queues-database-hooks) +- [QueuesDash](https://github.com/gotranseo/queues-dash) From bbad6750d6f92442d8653bda45ffec1928a74f06 Mon Sep 17 00:00:00 2001 From: tanaka Date: Sat, 31 Aug 2024 19:39:44 +0900 Subject: [PATCH 2/6] =?UTF-8?q?Changed=20=E5=88=97=20to=20=E3=82=AD?= =?UTF-8?q?=E3=83=A5=E3=83=BC=20in=20the=20navigation=20as=20=E5=88=97=20d?= =?UTF-8?q?oes=20not=20match=20the=20meaning=20of=20'Queues'=20in=20this?= =?UTF-8?q?=20context.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 683f34991..61cc070ad 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -511,7 +511,7 @@ plugins: Overview: 概要 Passwords: パスワード Query: クエリ - Queues: 列 + Queues: キュー Relations: 関係 Release Notes: リリースノート Routing: ルーティング From c3a2da8f0ed542560beba4b04558024d11559605 Mon Sep 17 00:00:00 2001 From: tanaka Date: Sat, 31 Aug 2024 20:32:36 +0900 Subject: [PATCH 3/6] Fix tip indentation to prevent UI layout issues --- docs/advanced/queues.ja.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/advanced/queues.ja.md b/docs/advanced/queues.ja.md index a24dabbe9..10358d0d3 100644 --- a/docs/advanced/queues.ja.md +++ b/docs/advanced/queues.ja.md @@ -28,7 +28,7 @@ Queuesには、メインプロトコルとインターフェースする正式 - [QueuesFluentDriver](https://github.com/m-barthelemy/vapor-queues-fluent-driver) !!! tip - `vapor/queues`パッケージは、ドライバを新規に構築している場合を除き、直接依存パッケージに追加しないでください。代わりにドライバパッケージのいずれかを追加してください。 + `vapor/queues`パッケージは、ドライバを新規に構築している場合を除き、直接依存パッケージに追加しないでください。代わりにドライバパッケージのいずれかを追加してください。 ## Getting Started From b11cb16c169fb396f35417dc1e9d4443762cd119 Mon Sep 17 00:00:00 2001 From: tanaka Date: Sat, 31 Aug 2024 20:56:43 +0900 Subject: [PATCH 4/6] Fix tip indentation to prevent UI layout issues --- docs/advanced/queues.ja.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/advanced/queues.ja.md b/docs/advanced/queues.ja.md index 10358d0d3..aefec9733 100644 --- a/docs/advanced/queues.ja.md +++ b/docs/advanced/queues.ja.md @@ -151,7 +151,7 @@ struct EmailJob: AsyncJob { } ``` !!! info - `Payload`型が`Codable`プロトコルを実装していることを確認してください。 + `Payload`型が`Codable`プロトコルを実装していることを確認してください。 !!! tip **Getting Started**の指示に従って、このジョブを設定ファイルに追加することを忘れないでください。 From 229858b88d3e0d30a748958e7d40e6b17133ac45 Mon Sep 17 00:00:00 2001 From: tanaka Date: Sat, 14 Sep 2024 22:16:16 +0900 Subject: [PATCH 5/6] Insert spaces between half-width and full-width characters. https://github.com/vapor/docs/pull/1004#discussion_r1758586844 --- docs/advanced/queues.ja.md | 104 ++++++++++++++++++------------------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/docs/advanced/queues.ja.md b/docs/advanced/queues.ja.md index aefec9733..04bc57a64 100644 --- a/docs/advanced/queues.ja.md +++ b/docs/advanced/queues.ja.md @@ -1,6 +1,6 @@ # Queues -Vapor Queues ([vapor/queues](https://github.com/vapor/queues)) は、タスクの責任をサイドワーカーに譲渡することができる、純粋なSwiftのキューシステムです。 +Vapor Queues ([vapor/queues](https://github.com/vapor/queues)) は、タスクの責任をサイドワーカーに譲渡することができる、純粋な Swift のキューシステムです。 このパッケージが適しているタスクの例: @@ -12,14 +12,14 @@ Vapor Queues ([vapor/queues](https://github.com/vapor/queues)) は、タスク このパッケージは [Ruby Sidekiq](https://github.com/mperham/sidekiq) に似ており、以下の機能を提供します: -- シャットダウン、再起動、または新しいデプロイを示すためにホスティングプロバイダーから送信される`SIGTERM`および`SIGINT`シグナルの安全な処理。 +- シャットダウン、再起動、または新しいデプロイを示すためにホスティングプロバイダーから送信される `SIGTERM` および `SIGINT` シグナルの安全な処理。 - 異なる優先度が付いたキュー。例えば、メールキューで実行するジョブとデータ処理キューで実行するジョブの優先度を指定できます。 - 予期しない障害に対処するための信頼性の高いキュープロセスの実装。 -- 指定された回数までジョブを成功するまで繰り返す`maxRetryCount`機能を含む。 -- NIOを使用して、利用可能なすべてのコアとEventLoopをジョブに活用。 +- 指定された回数までジョブを成功するまで繰り返す `maxRetryCount` 機能を含む。 +- NIO を使用して、利用可能なすべてのコアと EventLoop をジョブに活用。 - 定期実行処理をスケジュールする機能を提供。 -Queuesには、メインプロトコルとインターフェースする正式にサポートされているドライバが1つあります: +Queues には、メインプロトコルとインターフェースする正式にサポートされているドライバが 1 つあります: - [QueuesRedisDriver](https://github.com/vapor/queues-redis-driver) @@ -28,15 +28,15 @@ Queuesには、メインプロトコルとインターフェースする正式 - [QueuesFluentDriver](https://github.com/m-barthelemy/vapor-queues-fluent-driver) !!! tip - `vapor/queues`パッケージは、ドライバを新規に構築している場合を除き、直接依存パッケージに追加しないでください。代わりにドライバパッケージのいずれかを追加してください。 + `vapor/queues` パッケージは、ドライバを新規に構築している場合を除き、直接依存パッケージに追加しないでください。代わりにドライバパッケージのいずれかを追加してください。 ## Getting Started -Queuesの使用を開始する方法を見てみましょう。 +Queues の使用を開始する方法を見てみましょう。 ### Package -Queuesを使用するための最初のステップは、SwiftPMパッケージのマニフェストファイルに依存関係としてドライバの1つを追加することです。この例では、Redisドライバを使用します。 +Queues を使用するための最初のステップは、SwiftPM パッケージのマニフェストファイルに依存関係としてドライバの 1 つを追加することです。この例では、Redis ドライバを使用します。 ```swift // swift-tools-version:5.8 @@ -58,11 +58,11 @@ let package = Package( ) ``` -Xcode内でマニフェストを直接編集した場合、ファイルを保存すると自動的に変更を検出し、新しい依存関係を取得します。それ以外の場合は、ターミナルから`swift package resolve`を実行して新しい依存関係を取得します。 +Xcode 内でマニフェストを直接編集した場合、ファイルを保存すると自動的に変更を検出し、新しい依存関係を取得します。それ以外の場合は、ターミナルから `swift package resolve` を実行して新しい依存関係を取得します。 ### Config -次のステップは、`configure.swift`でQueuesを設定することです。ここでは、Redisライブラリを例として使用します: +次のステップは、`configure.swift` で Queues を設定することです。ここでは、Redis ライブラリを例として使用します: ```swift import QueuesRedisDriver @@ -72,24 +72,24 @@ try app.queues.use(.redis(url: "redis://127.0.0.1:6379")) ### Registering a `Job` -ジョブをモデリングした後、次のようにconfigurationセクションに追加する必要があります: +ジョブをモデリングした後、次のように configuration セクションに追加する必要があります: ```swift -//ジョブを登録 +// ジョブを登録 let emailJob = EmailJob() app.queues.add(emailJob) ``` ### Running Workers as Processes -新しいキューワーカーを開始するには、`swift run App queues`を実行します。特定の種類のワーカーを実行する場合は、`swift run App queues --queue emails`と指定することもできます。 +新しいキューワーカーを開始するには、`swift run App queues` を実行します。特定の種類のワーカーを実行する場合は、`swift run App queues --queue emails` と指定することもできます。 !!! tip - ワーカーは本番環境で実行し続ける必要があります。長時間実行するプロセスを維持する方法については、ホスティングプロバイダーに従ってください。例えば、Herokuでは、Procfileに`worker: Run queues`のように"worker" dynoを指定できます。これを設定すると、ダッシュボードのリソースタブや`heroku ps:scale worker=1`(または任意のdyno数)でワーカーを開始できます。 + ワーカーは本番環境で実行し続ける必要があります。長時間実行するプロセスを維持する方法については、ホスティングプロバイダーに従ってください。例えば、Heroku では、Procfile に `worker: Run queues` のように "worker" dyno を指定できます。これを設定すると、ダッシュボードのリソースタブや `heroku ps:scale worker=1`(または任意の dyno 数)でワーカーを開始できます。 ### Running Workers in-process -アプリケーションと同じプロセスでワーカーを実行するには(別のサーバーを起動して処理する代わりに)、`Application`の便利なメソッドを呼び出します: +アプリケーションと同じプロセスでワーカーを実行するには(別のサーバーを起動して処理する代わりに)、`Application` の便利なメソッドを呼び出します: ```swift try app.queues.startInProcessJobs(on: .default) @@ -106,7 +106,7 @@ try app.queues.startScheduledJobs() ## The `Job` Protocol -ジョブは`Job`または`AsyncJob`プロトコルで定義されます。 +ジョブは `Job` または `AsyncJob` プロトコルで定義されます。 ### Modeling a `Job` object: @@ -129,13 +129,13 @@ struct EmailJob: Job { } func error(_ context: QueueContext, _ error: Error, _ payload: Email) -> EventLoopFuture { - // エラーを処理しない場合は単にfutureを返すことができます。また、この関数を完全に省略することもできます。 + // エラーを処理しない場合は単に future を返すことができます。また、この関数を完全に省略することもできます。 return context.eventLoop.future() } } ``` -`async`/`await`を使用する場合は、`AsyncJob`を使用します: +`async`/`await` を使用する場合は、`AsyncJob` を使用します: ```swift struct EmailJob: AsyncJob { @@ -146,18 +146,18 @@ struct EmailJob: AsyncJob { } func error(_ context: QueueContext, _ error: Error, _ payload: Email) async throws { - // エラーを処理しない場合は単にreturnします。また、この関数を完全に省略することもできます。 + // エラーを処理しない場合は単に return します。また、この関数を完全に省略することもできます。 } } ``` !!! info - `Payload`型が`Codable`プロトコルを実装していることを確認してください。 + `Payload` 型が `Codable` プロトコルを実装していることを確認してください。 !!! tip - **Getting Started**の指示に従って、このジョブを設定ファイルに追加することを忘れないでください。 + **Getting Started** の指示に従って、このジョブを設定ファイルに追加することを忘れないでください。 ## Dispatching Jobs -キュージョブをディスパッチするには、`Application`または`Request`のインスタンスにアクセスする必要があります。ジョブをディスパッチするのは主にルートハンドラー内になるでしょう: +キュージョブをディスパッチするには、`Application` または `Request` のインスタンスにアクセスする必要があります。ジョブをディスパッチするのは主にルートハンドラー内になるでしょう: ```swift app.get("email") { req -> EventLoopFuture in @@ -179,7 +179,7 @@ app.get("email") { req async throws -> String in } ``` -`Request`オブジェクトが利用できないコンテキスト(例えば`Command`内)でジョブをディスパッチする必要がある場合は、`Application`オブジェクト内の`queues`プロパティを使用する必要があります。次のようにします: +`Request` オブジェクトが利用できないコンテキスト(例えば `Command` 内)でジョブをディスパッチする必要がある場合は、`Application` オブジェクト内の `queues` プロパティを使用する必要があります。次のようにします: ```swift struct SendEmailCommand: AsyncCommand { @@ -199,7 +199,7 @@ struct SendEmailCommand: AsyncCommand { ### Setting `maxRetryCount` -`maxRetryCount`を指定した場合、エラーが発生するとジョブは自動的に再試行されます。例えば: +`maxRetryCount` を指定した場合、エラーが発生するとジョブは自動的に再試行されます。例えば: ```swift app.get("email") { req -> EventLoopFuture in @@ -225,11 +225,11 @@ app.get("email") { req async throws -> String in ### Specifying a delay -ジョブを指定した`Date`が経過してからのみ実行するように設定できます。遅延を指定するには、`dispatch`の`delayUntil`パラメータに`Date`を渡します: +ジョブを指定した `Date` が経過してからのみ実行するように設定できます。遅延を指定するには、`dispatch` の `delayUntil` パラメータに `Date` を渡します: ```swift app.get("email") { req async throws -> String in - let futureDate = Date(timeIntervalSinceNow: 60 * 60 * 24) // 1日後 + let futureDate = Date(timeIntervalSinceNow: 60 * 60 * 24) // 1 日後 try await req.queue.dispatch( EmailJob.self, .init(to: "email@email.com", message: "message"), @@ -239,13 +239,13 @@ app.get("email") { req async throws -> String in } ``` -ジョブが`delay`パラメータの前にデキューされた場合、ドライバによってジョブが再キューされます。 +ジョブが `delay` パラメータの前にデキューされた場合、ドライバによってジョブが再キューされます。 -### Specify a priority +### Specify a priority -ジョブは必要に応じて異なるキュータイプ/プライオリティに分類できます。例えば、`email`キューと`background-processing`キューを開いてジョブを分類したい場合があります。 +ジョブは必要に応じて異なるキュータイプ/プライオリティに分類できます。例えば、`email` キューと `background-processing` キューを開いてジョブを分類したい場合があります。 -まず`QueueName`を拡張します: +まず `QueueName` を拡張します: ```swift extension QueueName { @@ -253,11 +253,11 @@ extension QueueName { } ``` -次に、`jobs`オブジェクトを取得する際にキュータイプを指定します: +次に、`jobs` オブジェクトを取得する際にキュータイプを指定します: ```swift app.get("email") { req -> EventLoopFuture in - let futureDate = Date(timeIntervalSinceNow: 60 * 60 * 24) // 1日後 + let futureDate = Date(timeIntervalSinceNow: 60 * 60 * 24) // 1 日後 return req .queues(.emails) .dispatch( @@ -271,7 +271,7 @@ app.get("email") { req -> EventLoopFuture in // or app.get("email") { req async throws -> String in - let futureDate = Date(timeIntervalSinceNow: 60 * 60 * 24) // 1日後 + let futureDate = Date(timeIntervalSinceNow: 60 * 60 * 24) // 1 日後 try await req .queues(.emails) .dispatch( @@ -284,7 +284,7 @@ app.get("email") { req async throws -> String in } ``` -`Application`オブジェクト内からアクセスする場合は、次のようにします: +`Application` オブジェクト内からアクセスする場合は、次のようにします: ```swift struct SendEmailCommand: AsyncCommand { @@ -305,14 +305,14 @@ struct SendEmailCommand: AsyncCommand { -キューを指定しない場合、ジョブは`default`キューで実行されます。各キュータイプのワーカーを起動する手順については、**Getting Started** の指示に従ってください。 +キューを指定しない場合、ジョブは `default` キューで実行されます。各キュータイプのワーカーを起動する手順については、**Getting Started** の指示に従ってください。 ## Scheduling Jobs -Queuesパッケージは、ジョブを特定の時点にスケジュールすることもできます。 +Queues パッケージは、ジョブを特定の時点にスケジュールすることもできます。 !!! warning - スケジュールされたジョブは、アプリケーションの起動前に`configure.swift`などで設定する必要があります。ルートハンドラー内では動作しません。 + スケジュールされたジョブは、アプリケーションの起動前に `configure.swift` などで設定する必要があります。ルートハンドラー内では動作しません。 ### Starting the scheduler worker スケジューラには、キューワーカーと同様に、別のワーカープロセスが必要です。このコマンドを実行してワーカーを起動できます: @@ -322,11 +322,11 @@ swift run App queues --scheduled ``` !!! tip - ワーカーは本番環境で実行し続ける必要があります。長時間実行するプロセスを維持する方法については、ホスティングプロバイダーに従ってください。例えば、Herokuでは、Procfileに`worker: App queues --scheduled`と指定することで「worker」dynoを指定できます。 + ワーカーは本番環境で実行し続ける必要があります。長時間実行するプロセスを維持する方法については、ホスティングプロバイダーに従ってください。例えば、Heroku では、Procfile に `worker: App queues --scheduled` と指定することで「worker」 dyno を指定できます。 ### Creating a `ScheduledJob` -まず、新しい`ScheduledJob`または`AsyncScheduledJob`を作成します: +まず、新しい `ScheduledJob` または `AsyncScheduledJob` を作成します: ```swift import Vapor @@ -360,42 +360,42 @@ app.queues.schedule(CleanupJob()) .at(.noon) ``` -上記の例では、ジョブは毎年5月23日の12:00 PMに実行されます。 +上記の例では、ジョブは毎年 5 月 23 日の 12:00 PM に実行されます。 !!! tip スケジューラはサーバーのタイムゾーンを考慮します。 ### Available builder methods -スケジューラには5つの主なメソッドがあり、それぞれがさらにヘルパーメソッドを含むビルダーオブジェクトを作成します。コンパイラが未使用の結果に関する警告を出さなくなるまで、スケジューラオブジェクトを構築し続けます。利用可能なすべてのメソッドは以下のとおりです: +スケジューラには 5 つの主なメソッドがあり、それぞれがさらにヘルパーメソッドを含むビルダーオブジェクトを作成します。コンパイラが未使用の結果に関する警告を出さなくなるまで、スケジューラオブジェクトを構築し続けます。利用可能なすべてのメソッドは以下のとおりです: | ヘルパー関数 | 利用可能な修飾子 | 説明 | |--------------|--------------------------------------------------------------|-------------------------------------------| -| `yearly()` | `in(_ month: Month) -> Monthly` | ジョブを実行する月。さらに構築するための`Monthly`オブジェクトを返します。 | -| `monthly()` | `on(_ day: Day) -> Daily` | ジョブを実行する日。さらに構築するための`Daily`オブジェクトを返します。 | -| `weekly()` | `on(_ weekday: Weekday) -> Daily` | ジョブを実行する曜日。`Daily`オブジェクトを返します。 | +| `yearly()` | `in(_ month: Month) -> Monthly` | ジョブを実行する月。さらに構築するための `Monthly` オブジェクトを返します。 | +| `monthly()` | `on(_ day: Day) -> Daily` | ジョブを実行する日。さらに構築するための `Daily` オブジェクトを返します。 | +| `weekly()` | `on(_ weekday: Weekday) -> Daily` | ジョブを実行する曜日。`Daily` オブジェクトを返します。 | | `daily()` | `at(_ time: Time)` | ジョブを実行する時間。チェーンの最終メソッド。 | | | `at(_ hour: Hour24, _ minute: Minute)` | ジョブを実行する時間と分。チェーンの最終メソッド。 | | | `at(_ hour: Hour12, _ minute: Minute, _ period: HourPeriod)` | 実行する時間、分、時間帯。チェーンの最終メソッド。 | | `hourly()` | `at(_ minute: Minute)` | 実行する分。チェーンの最終メソッド。 | | `minutely()` | `at(_ second: Second)` | 実行する秒。チェーンの最終メソッド。 | -### Available helpers -Queuesには、スケジューリングを容易にするためのいくつかのヘルパーenumが付属しています: +### Available helpers +Queues には、スケジューリングを容易にするためのいくつかのヘルパー enum が付属しています: -| ヘルパー関数 | 利用可能なヘルパーenum | +| ヘルパー関数 | 利用可能なヘルパー enum | |-------------|--------------------------------------| | `yearly()` | `.january`,`.february`,`.march`, ... | | `monthly()` | `.first`,`.last`,`.exact(1)` | | `weekly()` | `.sunday`,`.monday`,`.tuesday`, ... | | `daily()` | `.midnight`,`.noon` | -ヘルパーenumを使用するには、ヘルパー関数の適切な修飾子を呼び出し、値を渡します。例えば: +ヘルパー enum を使用するには、ヘルパー関数の適切な修飾子を呼び出し、値を渡します。例えば: ```swift -// 毎年1月 +// 毎年 1 月 .yearly().in(.january) -// 毎月1日 +// 毎月 1 日 .monthly().on(.first) // 毎週日曜日 @@ -406,9 +406,9 @@ Queuesには、スケジューリングを容易にするためのいくつか ``` ## Event Delegates -Queuesパッケージでは、ワーカーがジョブに対してアクションを取ったときに通知を受け取る`JobEventDelegate`オブジェクトを指定することができます。これは、モニタリング、インサイトの表示、またはアラートの目的で使用できます。 +Queues パッケージでは、ワーカーがジョブに対してアクションを取ったときに通知を受け取る `JobEventDelegate` オブジェクトを指定することができます。これは、モニタリング、インサイトの表示、またはアラートの目的で使用できます。 -始めるには、オブジェクトを`JobEventDelegate`に準拠させ、必要なメソッドを実装します: +始めるには、オブジェクトを `JobEventDelegate` に準拠させ、必要なメソッドを実装します: ```swift struct MyEventDelegate: JobEventDelegate { From 12fad091129e035d309f8247d4513fb0dd40d02f Mon Sep 17 00:00:00 2001 From: tanaka Date: Mon, 16 Sep 2024 15:35:15 +0900 Subject: [PATCH 6/6] Add IDs to headings to prevent URL-breaking changes and translate headings to Japanese --- docs/advanced/queues.ja.md | 34 +++++++++++++++++----------------- mkdocs.yml | 1 + 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/docs/advanced/queues.ja.md b/docs/advanced/queues.ja.md index 04bc57a64..b5ae9c605 100644 --- a/docs/advanced/queues.ja.md +++ b/docs/advanced/queues.ja.md @@ -30,7 +30,7 @@ Queues には、メインプロトコルとインターフェースする正式 !!! tip `vapor/queues` パッケージは、ドライバを新規に構築している場合を除き、直接依存パッケージに追加しないでください。代わりにドライバパッケージのいずれかを追加してください。 -## Getting Started +## はじめに {#getting-started} Queues の使用を開始する方法を見てみましょう。 @@ -60,7 +60,7 @@ let package = Package( Xcode 内でマニフェストを直接編集した場合、ファイルを保存すると自動的に変更を検出し、新しい依存関係を取得します。それ以外の場合は、ターミナルから `swift package resolve` を実行して新しい依存関係を取得します。 -### Config +### 設定 {#config} 次のステップは、`configure.swift` で Queues を設定することです。ここでは、Redis ライブラリを例として使用します: @@ -70,7 +70,7 @@ import QueuesRedisDriver try app.queues.use(.redis(url: "redis://127.0.0.1:6379")) ``` -### Registering a `Job` +### `Job` の登録 {#registering-a-job} ジョブをモデリングした後、次のように configuration セクションに追加する必要があります: @@ -80,14 +80,14 @@ let emailJob = EmailJob() app.queues.add(emailJob) ``` -### Running Workers as Processes +### プロセスとしてワーカーを実行 {#running-workers-as-processes} 新しいキューワーカーを開始するには、`swift run App queues` を実行します。特定の種類のワーカーを実行する場合は、`swift run App queues --queue emails` と指定することもできます。 !!! tip ワーカーは本番環境で実行し続ける必要があります。長時間実行するプロセスを維持する方法については、ホスティングプロバイダーに従ってください。例えば、Heroku では、Procfile に `worker: Run queues` のように "worker" dyno を指定できます。これを設定すると、ダッシュボードのリソースタブや `heroku ps:scale worker=1`(または任意の dyno 数)でワーカーを開始できます。 -### Running Workers in-process +### プロセス内でワーカーを実行 {#running-workers-in-process} アプリケーションと同じプロセスでワーカーを実行するには(別のサーバーを起動して処理する代わりに)、`Application` の便利なメソッドを呼び出します: @@ -104,11 +104,11 @@ try app.queues.startScheduledJobs() !!! warning キューワーカーをコマンドラインまたはプロセス内ワーカー経由で起動しない場合、ジョブはディスパッチされません。 -## The `Job` Protocol +## `Job` プロトコル {#the-job-protocol} ジョブは `Job` または `AsyncJob` プロトコルで定義されます。 -### Modeling a `Job` object: +### `Job` オブジェクトのモデリング {#modeling-a-job-object} ```swift import Vapor @@ -155,7 +155,7 @@ struct EmailJob: AsyncJob { !!! tip **Getting Started** の指示に従って、このジョブを設定ファイルに追加することを忘れないでください。 -## Dispatching Jobs +## ジョブのディスパッチ {#dispatching-jobs} キュージョブをディスパッチするには、`Application` または `Request` のインスタンスにアクセスする必要があります。ジョブをディスパッチするのは主にルートハンドラー内になるでしょう: @@ -197,7 +197,7 @@ struct SendEmailCommand: AsyncCommand { ``` -### Setting `maxRetryCount` +### `maxRetryCount` の設定 {#setting-maxretrycount} `maxRetryCount` を指定した場合、エラーが発生するとジョブは自動的に再試行されます。例えば: @@ -223,7 +223,7 @@ app.get("email") { req async throws -> String in } ``` -### Specifying a delay +### 遅延の指定 {#specifying-a-delay} ジョブを指定した `Date` が経過してからのみ実行するように設定できます。遅延を指定するには、`dispatch` の `delayUntil` パラメータに `Date` を渡します: @@ -241,7 +241,7 @@ app.get("email") { req async throws -> String in ジョブが `delay` パラメータの前にデキューされた場合、ドライバによってジョブが再キューされます。 -### Specify a priority +### 優先度の指定 {#specify-a-priority} ジョブは必要に応じて異なるキュータイプ/プライオリティに分類できます。例えば、`email` キューと `background-processing` キューを開いてジョブを分類したい場合があります。 @@ -307,14 +307,14 @@ struct SendEmailCommand: AsyncCommand { キューを指定しない場合、ジョブは `default` キューで実行されます。各キュータイプのワーカーを起動する手順については、**Getting Started** の指示に従ってください。 -## Scheduling Jobs +## ジョブのスケジューリング {#scheduling-jobs} Queues パッケージは、ジョブを特定の時点にスケジュールすることもできます。 !!! warning スケジュールされたジョブは、アプリケーションの起動前に `configure.swift` などで設定する必要があります。ルートハンドラー内では動作しません。 -### Starting the scheduler worker +### スケジューラワーカーの起動 {#starting-the-scheduler-worker} スケジューラには、キューワーカーと同様に、別のワーカープロセスが必要です。このコマンドを実行してワーカーを起動できます: ```sh @@ -324,7 +324,7 @@ swift run App queues --scheduled !!! tip ワーカーは本番環境で実行し続ける必要があります。長時間実行するプロセスを維持する方法については、ホスティングプロバイダーに従ってください。例えば、Heroku では、Procfile に `worker: App queues --scheduled` と指定することで「worker」 dyno を指定できます。 -### Creating a `ScheduledJob` +### `ScheduledJob` の作成 {#creating-a-scheduledjob} まず、新しい `ScheduledJob` または `AsyncScheduledJob` を作成します: @@ -365,7 +365,7 @@ app.queues.schedule(CleanupJob()) !!! tip スケジューラはサーバーのタイムゾーンを考慮します。 -### Available builder methods +### 利用可能なビルダーメソッド {#available-builder-methods} スケジューラには 5 つの主なメソッドがあり、それぞれがさらにヘルパーメソッドを含むビルダーオブジェクトを作成します。コンパイラが未使用の結果に関する警告を出さなくなるまで、スケジューラオブジェクトを構築し続けます。利用可能なすべてのメソッドは以下のとおりです: | ヘルパー関数 | 利用可能な修飾子 | 説明 | @@ -379,7 +379,7 @@ app.queues.schedule(CleanupJob()) | `hourly()` | `at(_ minute: Minute)` | 実行する分。チェーンの最終メソッド。 | | `minutely()` | `at(_ second: Second)` | 実行する秒。チェーンの最終メソッド。 | -### Available helpers +### 利用可能なヘルパー {#available-helpers} Queues には、スケジューリングを容易にするためのいくつかのヘルパー enum が付属しています: | ヘルパー関数 | 利用可能なヘルパー enum | @@ -405,7 +405,7 @@ Queues には、スケジューリングを容易にするためのいくつか .daily().at(.midnight) ``` -## Event Delegates +## イベントデリゲート {#event-delegates} Queues パッケージでは、ワーカーがジョブに対してアクションを取ったときに通知を受け取る `JobEventDelegate` オブジェクトを指定することができます。これは、モニタリング、インサイトの表示、またはアラートの目的で使用できます。 始めるには、オブジェクトを `JobEventDelegate` に準拠させ、必要なメソッドを実装します: diff --git a/mkdocs.yml b/mkdocs.yml index 61cc070ad..206616338 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -76,6 +76,7 @@ markdown_extensions: - admonition - footnotes - meta + - attr_list - toc: permalink: true