我对 DynamoDB 相当陌生,目前我们正在考虑使用 DynamoDB 将现有项目迁移到无服务器应用程序,我们希望从 RDMS 数据库调整以下设置:
表格:
我们希望使用 DynamoDB 进行查询,以获取具有一个或多个标签(按标签)的特定项目(按 ProjectID)的所有文件。在 RDMS 中,此查询很简单,如下所示:
SELECT * FROM Files JOIN Tags ON Tags.FileID = Files.FileID WHERE Files.ProjectID = ?PROJECT AND Tags.Tag = ?TAG_1 OR ?TAG_2 ...
目前,我们有以下 DynamoDB 设置(但仍然可以更改):
另请考虑项目条目数量巨大(1000 - 30000 之间)以及每个项目的文件数量(50 到 100.000 之间),并且查询应该非常快。
如何使用 DynamoDB 查询来实现这一点,最好不使用过滤表达式,因为它们是在数据选择后应用的?如果表Files可以有一个 StringSet Tags 作为列,那就完美了,但我猜这不能用于高效的 DynamoDB 查询(因此不使用 DynamoDB …
在我的应用程序中,我使用 AWS S3 上传和存储文件。每当文件上传到 S3 时,都会创建一个事件,触发特定的 lambda 函数?。然后,我的 lambda 函数?应该对我正在运行的 AWS Aurora 实例执行 SQL INSERT(使用 S3 事件的事件数据)。我预计?每秒将调用大约 10 - 50 次。
总结: S3 EVENT ? TRIGGERS ? ? AURORA INSERT
我发现各种帖子声称从 lambda 函数访问 Aurora(或一般的 RDS)可能会由于缺少连接池和 AWS Lambda 的无状态容器架构(例如AWS Lambda RDS 连接池)而导致问题。
我?可以用任何语言编写,所以问题是,使用什么语言/框架不会遇到 AWS Lambda 连接池问题,或者换句话说,是否可以每秒对 Aurora 执行 10 - 50 次插入Aurora MySQL 兼容 db.t2.small 实例?或者是否有任何替代方案可以使用 Lambda 以外的其他服务(例如 SNS)对 Aurora 执行 INSERTS,而无需编写和运行我自己的 EC2 实例?
2017 年 12 月 10 日更新:AWS …
mysql amazon-s3 amazon-web-services aws-lambda amazon-aurora
我正在尝试更改client_max_body_size我的Elastic Beanstalk NGINX反向代理的属性,以允许上传更大的JPEG文件.因此,我将文件夹".ebextensions"添加到我的WAR文件的根目录(WAR文件还包括一个Spring Boot应用程序),并添加了一个文件".ebextensions/01_files.config",其中包含以下内容:
files:
"/etc/nginx/conf.d/proxy.conf" :
mode: "000755"
owner: root
group: root
content: |
client_max_body_size 20M;
Run Code Online (Sandbox Code Playgroud)
我通过Travis-CI将WAR文件部署到Elastic Beanstalk.但是,Elastic Beanstalk似乎忽略了该文件,因为上传文件大小(例如2MB)不起作用,并且在用SSH连接到实例并查找"/etc/nginx/conf.d/proxy.conf"文件时不存在.
我已经使用YAML验证器成功验证了上述内容.我知道,存在很多相关的问题,但不是那些似乎解决了我的问题.我还检查了根目录中的WAR文件中是否包含".ebextensions/01_files.config".当我检查"/ tmp/eb_extracted_jar"时,文件".ebextensions/01_files.config"也存在正确的内容.我甚至找不到"/var/log/cfn-init.log"中的任何错误.我注意到,在几秒钟内,文件"proxy.conf"在部署期间出现在"/etc/nginx/conf.d/"中,但之后它已被删除.
由于通过Travis-CI部署到Elastic Beanstalk,是否会出现此问题?还是我错过了一些重要的东西?
编辑:
我刚刚认识到,部署应用程序时,每次创建"proxy.conf"文件几秒钟,但几秒后它就会消失(ls -lsa在"/etc/nginx/conf.d/"中查看,请参阅"elasticbeanstalk"目录和"healthd_http.conf"的时间戳为13:34,"proxy.conf"的时间戳为13:43)
4 drwxr-xr-x 3 root root 4096 6. Dec 13:43 .
4 drwxr-xr-x 4 root root 4096 6. Dec 13:34 ..
4 drwxr-xr-x 2 root root 4096 6. Dec 13:34 elasticbeanstalk
4 -rw-r--r-- 1 root root 148 6. Dec 13:34 healthd_http.conf
4 -rwxr-xr-x 1 root root 26 6. Dec 13:43 …Run Code Online (Sandbox Code Playgroud) 我已经实现了GenServer,它通过长时间轮询来侦听外部消息队列。为此,我以应用程序的开头启动GenServer,即在文件start/2功能中,我application.ex在主管列表中指定了一个额外的子级:
children = [
supervisor(MyApp.Repo []),
supervisor(MyAppWeb.Endpoint, []),
supervisor(MyApp.MessageQueueGenServer, [])
]
Run Code Online (Sandbox Code Playgroud)
然后,此列表开始于:
Supervisor.start_link(children, [strategy: :one_for_one, name: MyApp.Supervisor])
Run Code Online (Sandbox Code Playgroud)
现在,我有一个问题,当我运行某些(1)数据库设置mix ecto.reset或(2)测试时,GenServer当然也会启动mix test。
对于测试(2),我可以,例如,仅添加MyApp.MessageQueueGenServer到children列表中Mix.env != :test。
但是(1)呢?运行mix ecto.reset/ mix ecto.setup/ etc。时如何避免启动GenServer ?
Ecto中是否有内置方法可以在将其插入数据库之前Ecto.Changeset在调用时删除字段的尾部和前导空格changeset/2?
目前,我正在向架构中添加两个自定义函数以进行数据过滤以提高数据完整性:
defp trim_fields(changeset, fields) do
Enum.reduce(fields, changeset, &trim(&2, &1))
end
defp trim(changeset, field) do
if get_change(changeset, field) do
update_change(changeset, field, &String.trim/1)
else
changeset
end
end
Run Code Online (Sandbox Code Playgroud)
然后,可以使用以下方法将changeset/2函数传递给函数:
def changeset(%Customer{} = customer, attrs) do
|> cast(attrs, [:first_name, :last_name])
|> validate_required([:first_name], [:last_name])
|> trim_fields([:first_name, :last_name])
end
Run Code Online (Sandbox Code Playgroud)
因为我认为这是一个常见的用例,所以我想知道是否有一个已经提供此功能的功能?
如果Ecto中尚未提供此功能,那么从Ectos API的角度来看,添加此类功能并命名它们会很方便filter_trim,filter_...我猜呢?
elixir ×2
amazon-ec2 ×1
amazon-s3 ×1
aws-lambda ×1
ecto ×1
java ×1
mysql ×1
nginx ×1
spring-boot ×1