小编Oli*_*nce的帖子

在Cassandra中对版本化层次结构进行高效建模

免责声明:
这是一篇相当长的帖子.我首先解释我正在处理的数据,以及我想用它做什么.
然后我详细介绍了我考虑过的三种可能的解决方案,因为我已经尝试过做作业了(我发誓:]).我最终得到了"最佳猜测",这是第一个解决方案的变体.

我的终极问题是:使用Cassandra解决问题最明智的方法什么?这是我的尝试之一,还是别的什么?
我正在寻找经验丰富的Cassandra用户的建议/反馈......

我的数据:
我有很多SuperDocuments在树形结构(标题,副标题,部分......)中拥有文档.

每个SuperDocument结构都可以随着时间的推移而改变(主要是重命名标题),从而为我提供了多个版本的结构,如下所示.

超级版本

我正在寻找:
对于每个SuperDocument我需要按照上面的日期对这些结构加时间戳,并且我希望在给定的日期找到最接近的早期版本的SuperDocument结构.(即最新版本version_date < given_date)

这些考虑可能有助于更轻松地解决问题:

  • 版本是不可变的:变化非常罕见,我可以在每次更改时创建整个结构的新表示.
  • 我不需要访问结构的子树.
  • 我说可以说我不需要找到给定叶子的所有祖先,也不需要访问树内的特定节点/叶子.一旦我拥有整棵树,我就可以在我的客户端代码中完成所有这些工作.

好吧,让我们这样做
请记住我真的只是开始使用Cassandra.我已经阅读/观看了很多关于数据建模的资源,但是在该领域没有太多(任何!)经验!
这也意味着一切都将用CQL3编写...对不起节俭爱好者!

我第一次尝试解决这个问题是创建下表:

CREATE TABLE IF NOT EXISTS superdoc_structures (
    doc_id varchar,
    version_date timestamp,
    pre_pos int,
    post_pos int,
    title text,

    PRIMARY KEY ((doc_id, version_date), pre_pos, post_pos)

) WITH CLUSTERING ORDER BY (pre_pos ASC);
Run Code Online (Sandbox Code Playgroud)

这会给我以下结构:

在此输入图像描述

我在这里使用嵌套集模型 ; 我认为保持结构有序会很好,但我对其他建议持开放态度.

我喜欢这个解决方案:每个版本都有自己的行,其中每列代表层次结构的级别.
但问题是我(坦率地)打算查询我的数据如下:

SELECT * FROM superdoc_structures 
    WHERE doc_id="3399c35...14e1" AND version_date < '2014-03-11' LIMIT 1
Run Code Online (Sandbox Code Playgroud)

卡桑德拉很快提醒我,我不被允许这样做!(因为分区程序不保留群集节点上的行顺序,因此无法扫描分区键)

然后怎样呢...?
好吧,因为Cassandra不会让我在分区键上使用不等式,所以就这样吧!
我将制作version_date一个聚类键,我的所有问题都将消失.是的,不是真的...... …

data-modeling hierarchical-data cassandra cassandra-2.0

10
推荐指数
1
解决办法
4305
查看次数

在单个服务器上托管多个rails服务+"api enabled"网站的体系结构

我刚刚阅读了Paul Dix的着作"面向服务的设计与RoR",我想根据我刚刚学到的内容创建一个Rails 3 Web应用程序.

我认为我的基本架构是正确的,但是一个简单的问题就是阻止我:我应该如何在同一台服务器上托管多个REST服务?

这就是我现在看到的事情:

  • 基于Sinatra创建*服务应用程序(UserService,XYZFeatureService,...)(我猜),它提供REST端点来访问资源
  • 有一个前端Rails应用程序与控制器/视图/ ...消耗来自不同服务的数据.例如,最终用户可以访问它http://www.myapp.com.
  • 最后有一个独立的"API"应用程序来处理调用https://api.myapp.com/*https://www.myapp.com/api/*发布外部API,这些外部API将使用相同的服务,并在其上进行可能的身份验证,限制等.

这听起来像是一个好的开始吗?

就实现而言,从我在书中所读到的,我计划创建gems来处理rails app和服务之间的通信(我可能会抛出一些RabbitMQ但这是另一个故事).

但是,由于我只有一台物理服务器,我想知道如何让所有这些应用程序/服务一起生活?我的第一个猜测是在localhost上启动每个服务应用程序:xxxx其中xxxx是每个服务的不同非特权端口.我可以在rails应用程序中配置每个客户端gem以使用这些端口.

除此之外,我可能会运行Apache 2 + Passenger来为我的rails前端和API服务提供服务,使用像Rack :: URLMap(或虚拟主机,如果使用子域)来将请求定向到正确的应用程序.我是否应该在生产环境中使用Passenger来运行我的服务?

这是正确的方式吗?!它与我所阅读和学习的内容一致,并且如果需要也很容易分成几个物理服务器,但我想确定我没有遗漏一些东西.你会以不同的方式建造东西

非常感谢您的投入!

更新

我想要回答的主要问题是:

  • 所描述的体系结构是否适合使用外部API端点构建Web应用程序?
  • 在不同端口上的单个服务器上运行服务是否可以?

谢谢!

rest web-services ruby-on-rails sinatra ruby-on-rails-3

6
推荐指数
1
解决办法
1045
查看次数

Cloud Storage 存储分区的 Cloud SQL 导入权限问题

我正在编写一个云函数来:

  • Cloud SQL (postgresql) 数据库导出到 Cloud Storage 存储分区中的文件
  • 其重新导入另一个 Cloud SQL 实例/数据库(仍然是 postgresql)

注意: 我希望这段代码每晚自行运行,以将生产数据库复制到暂存环境,因此我计划使用 Cloud Scheduler 触发它。
如果您有更好/更简单的解决方案可以在 GCP 中解决这个问题,我会全力以赴:)

这是我的代码(实际功能clone_db在文件底部):

from os import getenv
from datetime import datetime
from time import sleep

from googleapiclient import discovery
from googleapiclient.errors import HttpError
from oauth2client.client import GoogleCredentials
from google.cloud import storage

GS_BUCKET = getenv("GS_BUCKET")
GS_FOLDER = "sql-exports"
GS_EXPORT_PATH = f"gs://{GS_BUCKET}/{GS_FOLDER}"


def __sql_file_name(db: str, timestamp: datetime):
    return f"{db}-{timestamp.strftime('%Y-%m-%d')}.sql.gz"


def __sql_file_uri(db: str, timestamp: datetime):
    return f"{GS_EXPORT_PATH}/{__sql_file_name(db, timestamp)}" …
Run Code Online (Sandbox Code Playgroud)

python google-cloud-storage google-cloud-sql google-cloud-platform google-cloud-functions

5
推荐指数
0
解决办法
1340
查看次数

为什么rails app显示/公共索引列表而不是实际的应用程序?

一旦它在服务器上,你如何设置apache来显示rails应用程序?我的rails应用程序在localhost上完美运行,但是当我访问外部站点时,它会为我提供索引信息

像这样

Name    Last modified   Size    Description
[TXT]   404.html    21-May-2012 21:38   728      
[TXT]   422.html    21-May-2012 21:38   711      
[TXT]   500.html    21-May-2012 21:38   643      
[IMG]   favicon.ico 21-May-2012 21:38   0    
[TXT]   robots.txt  21-May-2012 21:38   204      
Run Code Online (Sandbox Code Playgroud)

这是我的虚拟主机信息

<VirtualHost *:80>
      ServerAdmin example@example.com
      ServerName server.example.com
      # ServerAlias
      DocumentRoot /var/www/sample_app/current/public
      ErrorLog /var/www/sample_app/error.log

          RailsEnv production
        <Directory "/var/www/sample_app/current/public">
          Options Indexes FollowSymLinks MultiViews
          Order allow,deny
          Allow from all
        </Directory>
</VirtualHost>
Run Code Online (Sandbox Code Playgroud)

apache ruby-on-rails virtualhost

3
推荐指数
1
解决办法
2369
查看次数