我现在正在为WebApi 2实现我自己的UserStore,所以它适用于cassandra。我的问题是,如果我应该在请求后关闭连接并重新连接到cassandra以获取下一个请求。
现在我正在启动应用程序时建立连接,并将cassandra Context传递给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
}
答案 0 :(得分:3)
当您决定是否应该连接池时,通常需要回答2个问题:
在某些网络(如EC2)上建立连接的成本更高,具体取决于网络类型和计算机以及您的体系结构设置。它可能需要几毫秒,如果您每次都建立连接,则会增加查询时间。如果您关心保存这些毫秒,那么汇集连接对您来说是更好的选择。
在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。
答案 1 :(得分:0)
DataStax C#驱动程序已在内部提供连接池,因此推荐的使用驱动程序的方法是使用每个C *集群的Cluster实例和每个键空间的Session。在应用程序启动时基本初始化这些( nb 你也可以准备PreparedStatements,在请求中重复使用这些,并在停止应用程序时关闭它们以进行清理(用于升级等)。
我强烈建议您快速阅读C# driver docs。它不应该花费你很长时间,你会更多地了解驱动程序中包含的内容。