【问题标题】:Amplify Datastore subscription cost扩大数据存储订阅成本
【发布时间】:2022-01-26 14:24:49
【问题描述】:

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

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

【问题讨论】:

    标签: aws-appsync amplify appsync-subscription


    【解决方案1】:

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

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

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

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

    // 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)
        }
      }
    

    【讨论】:

    • 如果只有一个模型并且所有用户都订阅该模型怎么办。我们可以根据某些模型属性过滤订阅吗?我不认为 Datastore 提供任何这样的 API。样板订阅方法也没有任何提供过滤的规定。
    猜你喜欢
    • 2022-12-22
    • 2018-05-21
    • 2021-12-28
    • 2020-05-22
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多