0

我正在尝试了解 Datastore 的成本。似乎它订阅了所有突变。因此,如果有 50 个用户,那么每条消息将被发送 50 次,即使它不是必需的。由于每个实时突变都需要花钱,我们将为此实时消息突变支付不必要的 49 倍。另外,在我看来 SyncExpression 对此订阅没有任何影响。

我真的被困在这里了。有人能澄清一下就好了

4

1 回答 1

0

Amplify 会为您生成数据存储样板代码,但您仍需要调用它。您不会为每个用户和每个突变付费。

您只会为每个用户订阅用户感兴趣的内容的突变(显式调用代码以侦听更改)。例如,如果您正在查看 TODO 项目,您将为用户订阅该项目并且他们会立即查看其他人是否在另一台设备上对其进行了修改。

更新 长话短说...我通过制作 lambda 解析器来通过 GraphQL 触发后端计算。计算时间过长,GQL 调用会超时。我更新了代码,因此 GQL 调用异步调用自身(重新触发 lambda),并立即返回。然后,当长时间运行的任务在 spun-up lambda 中完成时,我更新了数据库中的一条记录。我使用 AppSync 而不是直接 GQL 更新记录,因此它会触发突变,并且在反应客户端中,我会监听将要更新的特定记录的突变。这样,只有 1 个用户在监听(如果他们触发了长时间运行的操作),并且该用户只收到有关他们感兴趣的单个数据库记录的更改的通知,而不会收到其他用户的更新。

我不知道这一切是否适用于你的情况。下面的代码片段可能会对您有所帮助,但它们有些断章取义。

// In amplify/backend/api/projectname/schema.graphql
type Subscription {
  onCouponWithIdUpdated(id: ID!): Coupon @aws_subscribe(mutations: ["updateCoupon"])
}


// In my useSendCoupon hook...
  // Subscribe to coupon updates
  useEffect(() => {
    if (0 === couponId) {
      return
    }
    console.log(`subscribe to coupon updates for couponId:`, couponId)
    const onCouponWithIdUpdated = /* GraphQL */ `
      subscription OnCouponWithIdUpdated($id: ID!) {
        onCouponWithIdUpdated(id: $id) {
          id
          proofLink
          owner
        }
      }
    `
    const subscription = API
      .graphql(graphqlOperation(onCouponWithIdUpdated, { id: couponId }))
      .subscribe({
        next: ({ provider, value }) => {
          const coupon = value.data.onCouponWithIdUpdated
          //console.log(`Proof Link:`, coupon.proofLink)
          setProofLinks([coupon.proofLink])
          setSendCouponState(COUPON_STATE_PREVIEW_SUCCESS)
        },
        error: error => console.warn(error)
      })
    console.log('subscribed: ', subscription)
    return () => {
      console.log(`unsubscribe to coupon updates`)
      subscription.unsubscribe()
    }
  }, [couponId])


// inside a lambda...
const updateCouponWithProof = async (authorization, couponId, proofLink) => {
    const initializeClient = () => new AWSAppSyncClient({
      url: process.env.API_XXXX_GRAPHQLAPIENDPOINTOUTPUT,
      region: process.env.REGION,
      auth: {
        type: AUTH_TYPE.AMAZON_COGNITO_USER_POOLS,
        jwtToken: authorization
      },
      disableOffline: true,
    })

    const executeMutation = async (mutation, operationName, variables) => {
      const client = initializeClient()
      try {
        const response = await client.mutate({
          mutation: gql(mutation),
          variables,
          fetchPolicy: "no-cache",
        })
        return response.data[operationName]
      } catch (err) {
        console.log("Error while trying to mutate data", err)
        throw JSON.stringify(err)
      }
    }

    const updateCoupon = /* GraphQL */ `
  mutation UpdateCoupon(
    $input: UpdateCouponInput!
    $condition: ModelCouponConditionInput
  ) {
    updateCoupon(input: $input, condition: $condition) {
      id
      proofLink
      owner
    }
  }
`
    const variables = { input: { id: couponId, proofLink } }
    try {
      return await executeMutation(updateCoupon, 'updateCoupon', variables)
    } catch (error) {
      console.log(`executeMutation error`, error)
    }
  }
于 2022-01-04T16:52:21.077 回答