【问题标题】:Permanent connection to cassandra or connection per request?与 cassandra 的永久连接或每个请求的连接?
【发布时间】:2014-02-04 14:45:49
【问题描述】:

我现在正在为 WebApi 2 实现我自己的 UserStore,因此它可以与 cassandra 一起使用。我的问题是,如果我应该在请求后关闭连接并重新连接到 cassandra 以进行下一个请求。

现在我正在应用程序启动时建立连接并将 cassandra 上下文传递给 UserStore 以使用。当我关闭应用程序时,连接关闭。

我想知道是否例如10人同时注册,一个人连接可以吗?

static Startup()
        {
            PublicClientId = "self";

              //Connecting to Cassandra
            Cluster cluster = Cluster.Builder().AddContactPoint("127.0.0.1").Build();
            Session session = cluster.Connect();

            Context context = new Context(session);

   //passing context
            UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));

            OAuthOptions = new OAuthAuthorizationServerOptions
            {
                TokenEndpointPath = new PathString("/Token"),
                Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
                AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
                AllowInsecureHttp = true
            };
        }



//UserStore Method for Registration
    public virtual Task CreateAsync(TUser user)
    {
        if (user == null)
        {
            throw new ArgumentNullException("user");
        }
        var usertable = _context.GetTable<TUser>("users");
        //insert user into table
    }

【问题讨论】:

  • 你用的是什么驱动?

标签: c# asp.net-web-api nosql cassandra


【解决方案1】:

当您决定是否应该使用连接池时,通常需要回答 2 个问题:

  1. 每次建立连接的成本是多少?

在 EC2 等某些网络上建立连接的成本更高,具体取决于网络和机器的类型以及您的架构设置。如果您每次都建立连接,这可能需要几毫秒,这会增加您的查询时间。如果您关心节省这些毫秒数,那么池连接对您来说是一个更好的选择。

  1. 与数据库的连接是由操作系统管理的资源,应用服务器和数据库服务器在使用或休眠时持有这些资源。如果您的硬件资源不足,则应将连接视为文件。您打开它们,读取或写入它们,然后关闭它们。如果您没有硬件资源限制,则不必担心资源池。

在 Cassandra 方面,如果您将 rpc_server_type 设置为同步,那么每个连接都会有自己的线程,至少需要 180K,如果您有很多客户端,那么内存将是您的限制因素。如果您选择 hsha 作为 rpc_server_type,那么这将不是问题。

阅读:https://github.com/apache/cassandra/blob/trunk/conf/cassandra.yaml#L362

关于您的应用程序性能:

理想情况下,如果您将 Cassandra 与多节点设置一起使用,您希望将请求分发到多个节点(协调器),以便更好地扩展。因此,最好不要坚持使用相同的连接,因为您将始终与同一个协调员交谈。

其次,如果您使用多线程,则要确保您的连接在对 Cassandra 的每个查询期间都使用同一个线程,否则,您最终可能会遇到一个线程处于竞争状态的情况更新已被使用的连接资源(例如,当它先前正在等待来自服务器的响应时,尝试向服务器发送查询数据包)。

我建议实现一个线程安全的连接池,并在应用程序启动时打开多个连接,并为每个请求随机使用它们,并在应用程序服务器停止时终止它们。如果您有硬件限制,请确保考虑更改 Cassandra 中的 rpc_server_type。

【讨论】:

    【解决方案2】:

    DataStax C# 驱动程序已经在内部提供了连接池,因此推荐的使用驱动程序的方法是为每个 C* 集群使用一个 Cluster 实例,并为每个键空间使用一个 Session。基本上在应用程序启动时初始化它们(nb你也可以准备 PreparedStatements),跨请求重用它们,并在停止应用程序时关闭它们以进行清理(用于升级等)。

    我强烈建议您快速阅读C# driver docs。用不了多久,您就会对驱动程序中包含的内容有更多了解。

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 1970-01-01
      • 2011-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      • 2015-10-27
      • 1970-01-01
      相关资源
      最近更新 更多