用cassandra创建实时应用程序的正确方法

unguejic  于 2021-06-14  发布在  Cassandra
关注(0)|答案(2)|浏览(386)

现在我有一个运行cassandra的ec2示例和一个简单的websocket服务器。我想知道这是否是正确的方式,使一个“实时”聊天应用程序。我有什么遗漏吗?
客户机连接到websocket,插入一条消息,该消息被存储到数据库中,如果数据库中的记录成功,则该消息被发送给用户。

const cassandra = require('cassandra-driver');
const client = new cassandra.Client({ contactPoints: ['127.0.0.1'], 
localDataCenter: 'datacenter1' });

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 3000 });

wss.on('connection', function connection(ws) {
  ws.on('message', function incoming(message) {

   //Insert message into Cassandra DB
   //Send message to other users if record to database with a consistency 
      level of one is successful
   //Then send messages to users connected to the websocket in chatroom

});

编辑:我似乎也找不到像这样的东西,所以如果你有任何链接,请分享任何教程

uz75evzq

uz75evzq1#

你的问题没有简单的答案,也不清楚是怎么回事在cassandra这样的分布式系统中,“如果数据库中的记录成功了”并不是一件容易的事情,因为您可以有许多数据的副本。它总是在数据一致性和可用性之间进行权衡。首先,在使用cassandra之前,你需要理解cap定理。
我不确定聊天应用程序是否有很强的一致性,但最好有2到3个数据副本。在cassandra的情况下,您可以选择更合适的一致性级别。我想对于聊天按摩来说 ONE 或者 ANY 在这种情况下,csaandra将提供最终的一致性,但与更“强”的一致性级别相比,您将拥有更多的可用性和性能。

vuktfyat

vuktfyat2#

Cassandra的优点。
由于使用lsm树,cassandra擅长处理高负载写操作。
cassandra作为分布式存储的维护相对简单。与rdbms不同,cassandra从一个侧面具有收件箱复制、一致性级别等。与hbase不同,cassandra从另一个侧面具有相同的列组(没有主服务器、区域服务器等)。
Cassandra的犯人。
如果没有高负载,与单节点rdbms解决方案相比,cassandra在硬件消耗(尤其是ram)或可维护性方面都是一个巨大的开销。
Cassandra在分布式模式下有所谓的 eventual consistency . 简而言之,这听起来不错,但有时行的顺序会有问题,这对您的聊天历史记录可能至关重要。这是这篇文章的链接https://aphyr.com/posts/299-the-trouble-with-timestamps 这很古老,但只是为了解释一下大意。
您被绑定到初始数据模型。任何带有where子句的读取查询,如果其中包含的字段不在主键/集群键中,则将无法执行。sql支持非常差,并且受到任何聚合查询等的限制。
我相信在系统设计过程中,上面的项目是值得考虑的。

相关问题