无服务器的Amazon Aurora Postgres:数据库返回的值超出了允许的响应大小限制

时间:2020-01-13 07:31:32

标签: postgresql amazon-rds-aurora aurora aws-aurora aws-aurora-serverless

我们正在探索无极光作为我们项目之一的数据库存储。在执行POC以便从无服务器无极群集中获取事件时,我们收到“数据库返回的值超出允许的响应大小限制”的异常。

  1. 是否有内置的解决方案?无服务器极光环境中是否存在类似于dynamoDB的令牌机制?
  2. 快速获取50,000是我们的关键要求之一。我们应该使用Aurora还是Aurora Serverless?

有关数据库的更多详细信息:Aurora PostgreSQL服务器更少。

用于进行POC我们正在使用具有这些限制的数据API。

import boto3;

client = boto3.client('rds-data')

import sys;
sql_statement = "select * from table_name limit 1000"

response = client.execute_statement(  
    database='mydb',  
    secretArn='<secret_arn',  
    resourceArn='<resource_arn>',  
    sql=sql_statement  
) 

print(response);

3 个答案:

答案 0 :(得分:3)

通过Data API在任何Aurora Serverless实例中进行查询时,您有两个大小限制:

  1. 每个返回的行不能大于64 KB;
  2. 结果集不能大于1 MB。

当前,Data API中没有解决方案可以克服这些限制。在Amazon Aurora User Guide中,有一个建议的解决方案可以解决第164页中的第二个问题:

在这种情况下,数据库返回的结果集的大小太大。在数据库返回的结果集中,Data API限制为1 MB。 要解决此问题,请确保对Data API的调用返回的数据量为1 MB或更少。如果您需要返回1 MB以上的内存,则可以在查询中的LIMIT子句中使用多个ExecuteStatement调用。

考虑到这一点,您可以进行指数补偿,直到为结果集找到可接受的LIMIT为止,或者设置固定的LIMIT(即使您在行中增加了行大小也可以保证它始终小于1 MB),未来。

定义了如何设置LIMIT子句值(取决于您的集群使用MySQL 5.6MySQL 5.7还是PostgreSQL 10.7)之后,您可以执行COUNT查询以了解您有多少结果将获得,然后进行迭代,直到执行COUNT / LIMIT语句为止。 另一种选择是迭代直到语句响应的行数少于LIMIT。

答案 1 :(得分:0)

由于某种原因,pandas read_sql的“ chunksize”参数不适用于AWS Data API。顺便说一下,我正在使用MySQL,但是pydataapi应该同时支持两者。

我为这个问题找到的解决方案是使用pandas的read_sql以字符串格式LIMITs迭代地查询数据库。这将使用pydataapi python package

我首先使用语法获取了表格的长度

console.log(converter(4));

然后使用numpy.arange()确定请求的起始行。每个查询将在此处询问由“ chunksize”参数指定的行数。我选择了20,000,但您应该选择不会导致响应大于1MB的最大值。

然后,只需连接数据帧列表即可。我发现这是目前最佳的解决方案。

import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { SomeAPIService } from '../some_file/someAPIService.service.ts

@Component({
  templateUrl: './your_Page.html',
  styleUrls: ['./your_Styles.scss']
})

export class (your class) implements OnInit, OnDestroy {
   // This is a subject variable at it simplest form 
     private unsubscribe$ = new Subject<void>();

     constructor (private someAPIService : SomeAPIService) {}
   
     ngOnit(): void { 
       this.someAPIService.getTODOlist({id:1})
        .pipe(takeUntil(this.unsubscribe$))
         .subscribe((value: SomeVariable) => {
         // What ever value you need is SomeVariable
      },)
    }


     ngOnDestroy(): void {
    // clears all, page subscriptions 
      this.unsubscribe$.next();
      this.unsubscribe$.complete();
     }
`}

答案 2 :(得分:0)

https://github.com/cloud-utils/aurora-data-api 处理这个问题

使用库获取所有查询的快速示例

with aurora_data_api.connect(aurora_cluster_arn=cluster_arn, secret_arn=secret_arn, database="cool_db_name_here") as conn:
    with conn.cursor() as cursor:
        cursor.execute("select * from cool_table")
        data = cursor.fetchall()