当前位置: 首页 > 知识库问答 >
问题:

如何在AWS lambda中锁定共享变量以执行写操作

朱通
2023-03-14

我正在研究AWS lambda(无状态服务,您可以在其中运行代码)链接-什么是AWS lambda

在我的例子中,lambda正在运行1个服务,对于该服务,每个请求都必须执行写操作。每个请求绑定一个Id。

如果,请求是用相同的id绑定的。那么,应该按顺序处理。

所以,要做到这一点。我们必须锁定“id”。这样,我们就可以避免写操作冲突。

要做到这一点(我的研究)-

  1. 创建具有1列Id的MySQL表,它是主键。意味着,您不能将1个id保留超过1次。

伪代码-

获取锁执行写操作释放锁

在这里,获取锁意味着-

如果,id已经存在,则等待,否则将id插入Mysql

释放的意思是-

从MySQL中删除id

代码-

public void run() {

    String host = "AWS-RDS_HOST";
    String userName = "USERNAME";
    String password = "PASSWORD";
    String dbName = "DBNAME";
    Connection connection = createConnection(host, userName, password, dbName);
    Statement statement = null;

    try {
        statement = connection.createStatement();
    } catch(SQLException e) {
        throw new RuntimeException("Failed at taking statement");
    }

    // Aquire lock.
    while(true) {
        try {
            statement.executeUpdate("insert into locktable values('"+id+"');");
        } catch(SQLException e) {
            System.out.println("Failed in taking lock. Waiting for others to release the lock.");
            continue;
        }

        System.out.println("Yes...I took lock");
        break;
    }

    // Execute write operation
    System.out.println("Doing write operation");
    System.out.println("Wrtie operation completed");

    // Release lock.
    while(true) {
        try {
            statement.executeUpdate("DELETE from locktable where id='"+id+"'");
        } catch(SQLException e) {
            System.out.println("Failed to remove lock - " + id);
            continue;
        }
        System.out.println("Lock removed. Id - " + id);
        break;
    }
}`

问题-

  1. 对于相同的id保持顺序行为,这种想法正确吗
  2. 这个问题有没有更好的解决方案/想法
  3. 如果你有一些关于这个问题的博客,请与我分享

共有1个答案

陶瀚玥
2023-03-14

部分回答您的问题:

我建议实现一个基于运动流的解决方案。复制自Kinesis Streams常见问题解答:

问:我应该什么时候使用Amazon Kinesis Streams,什么时候应该使用Amazon SQS?

我们建议Amazon Kinesis Streams用于具有类似以下要求的用例:

>

  • 将相关记录路由到同一记录处理器[...]。例如,当给定密钥的所有记录都路由到同一记录处理器时,计数和聚合会更简单。

    记录的排序。

    这个想法是让一个Lambda充当Kinesis Producer,即处理传入html" target="_blank">请求并将记录放入Kinesis Streams。第二个Lambda将实现为Kinesis消费者(又名Kinesis Streams应用程序),它将从Kinesis Streams获取数据并执行您的写入操作。您可以根据您的id设置Kinesis Streams分区键。

    请参见此SO答案。

  •  类似资料:
    • 你可以在怎么使用变量中所描述的方式来创建,初始化,保存及加载单一的变量.但是当创建复杂的模块时,通常你需要共享大量变量集并且如果你还想在同一个地方初始化这所有的变量,我们又该怎么做呢.本教程就是演示如何使用tf.variable_scope() 和tf.get_variable()两个方法来实现这一点. 问题 假设你为图片过滤器创建了一个简单的模块,和我们的卷积神经网络教程模块相似,但是这里包括两

    • 一般情况下,当一个传递给Spark操作(例如map和reduce)的函数在远程节点上面运行时,Spark操作实际上操作的是这个函数所用变量的一个独立副本。这些变量被复制到每台机器上,并且这些变量在远程机器上 的所有更新都不会传递回驱动程序。通常跨任务的读写变量是低效的,但是,Spark还是为两种常见的使用模式提供了两种有限的共享变量:广播变量(broadcast variable)和累加器(acc

    • Shared variables (共享变量)是为所有模板定义的变量。可以使用 setSharedVariable 方法向配置中添加共享变量: Configuration cfg = new Configuration(Configuration.VERSION_2_3_22); ... cfg.setSharedVariable("warp", new WarpDirective()); cfg

    • 问题内容: 我将Jenkins用于测试/构建目的,因此我使用以下配置创建了一个MultiJob项目: Test Job Build Job Install Job MultiJob是从Master Jenkins启动的,但是其他作业是 从其他Node 启动的。生成作业执行创建 BUILD_ID 的Shell脚本。现在,我希望将BUILD_ID作为参数传递给安装 作业。我怎样才能做到这一点?我唯一的

    • 主要内容:广播变量,累加器在Spark中,当任何函数传递给转换操作时,它将在远程集群节点上执行。它适用于函数中使用的所有变量的不同副本。这些变量将复制到每台计算机,并且远程计算机上的变量更新不会恢复到驱动程序。 广播变量 广播变量支持在每台机器上缓存的只读变量,而不是提供任务的副本。Spark使用广播算法来分发广播变量以降低通信成本。 spark动作的执行经过几个阶段,由分布式“shuffle”操作分开。Spark自动广播

    • 你可以在怎么使用变量中所描述的方式来创建,初始化,保存及加载单一的变量.但是当创建复杂的模块时,通常你需要共享大量变量集并且如果你还想在同一个地方初始化这所有的变量,我们又该怎么做呢.本教程就是演示如何使用tf.variable_scope() 和tf.get_variable()两个方法来实现这一点. 问题 假设你为图片过滤器创建了一个简单的模块,和我们的卷积神经网络教程模块相似,但是这里包括两