相关疑难解决方法(0)

Linq-to-Sql中的顺序GUID?

我刚刚阅读了一篇关于NHibernate从系统时间(Guid.Comb)创建GUID的能力的博客文章,从而避免了大量的数据库碎片.您可以将其称为客户端等效于SQL Server顺序ID.

有没有办法在Linq-to-Sql项目中使用类似的策略(通过在代码中生成Guid)?

.net nhibernate guid linq-to-sql

20
推荐指数
2
解决办法
7349
查看次数

建议的解决方案:在分布式环境中生成唯一ID

我一直在浏览网络,试图找到一个允许我们在区域分布式环境中生成唯一ID的解决方案.

我查看了以下选项(以及其他选项):

SNOWFLAKE(Twitter)

  • 这似乎是一个很好的解决方案,但我不喜欢为了创建ID而必须管理另一个软件的额外复杂性;
  • 它在这个阶段缺乏文档,所以我认为这不是一个好的投资;
  • 节点需要能够使用Zookeeper相互通信(延迟/通信故障怎么样?)

UUID

  • 看看吧:550e8400-e29b-41d4-a716-446655440000 ;
  • 它是一个128位ID;
  • 有一些已知的碰撞(取决于我猜的版本)看到这篇文章.

与MYSQL类似的关系数据库中的自动编码

  • 这似乎是安全的,但不幸的是,我们没有使用关系数据库(可伸缩性首选项);
  • 我们可以为此部署一个MySQL服务器,就像Flickr所做的那样,但同样,这又引入了另一个故障点/瓶颈.还增加了复杂性.

像COUCHBASE一样的非关系数据库中的自动识别

  • 这可能有用,因为我们使用Couchbase作为我们的数据库服务器,但是;
  • 当我们在不同区域有多个集群,延迟问题,网络故障时,这将无效:在某些时候,ID会根据流量的数量发生冲突;

我提出的解决方案(这是我需要帮助的)

假设我们在5个不同的地区(非洲,欧洲,亚洲,美洲和大洋洲)拥有由10个Couchbase节点和10个应用节点组成的集群.这是为了确保从最靠近用户的位置提供内容(以提高速度)并在发生灾难时确保冗余等.

现在,任务是生成在复制(和平衡)发生时不会发生碰撞的ID,我认为这可以通过3个步骤实现:

步骤1

将为所有区域分配整数ID(唯一标识符):

  • 1 - 非洲;
  • 2 - 美国;
  • 3 - 亚洲;
  • 4 - 欧洲;
  • 5 - Ociania.

第2步

为添加到群集的每个应用程序节点分配一个ID,记住一个群集中最多可能有99 999个服务器(尽管我怀疑:这是一个安全的预防措施).这看起来像这样(假IP):

  • 00001 - 192.187.22.14
  • 00002 - 164.254.58.22
  • 00003 - 142.77.22.45
  • 等等.

请注意,所有这些都在同一个集群中,这意味着您可以在每个区域拥有节点00001.

第3步

对于插入数据库的每个记录,将使用递增的ID来标识它,这就是它的工作方式:

Couchbase提供了一个增量功能,我们可以使用它在群集内部创建ID.为确保冗余,将在群集中创建3个副本.由于它们位于同一个地方,我认为应该可以安全地假设除非整个群集关闭,否则将有一个负责此节点的节点,否则可以增加许多副本.

将它们整合在一起

假设用户正在从欧洲注册:服务请求的应用程序节点将获取区域代码(在这种情况下为4),获取自己的ID(比如00005),然后从Couchbase 获取增加的ID(1)(来自相同的)簇).

我们最终有3个组成部分:4, 00005,1.现在,要从中创建ID,我们可以将这些组件加入其中4.00005.1.为了使它更好(我对此不太确定),我们可以连接(而不是添加它们)组件以结束:4000051.

在代码中,这将看起来像这样:

$id = '4'.'00005'.'1'; …

php distributed couchbase

12
推荐指数
1
解决办法
2580
查看次数

替代GUID并考虑Scalablity和友好URL

我决定使用GUID作为我的许多项目数据库表的主键.我认为这是一个很好的做法,特别是考虑到可扩展性,备份和恢复.问题是我不想使用常规GUID并搜索替代方法.我真的很想知道Pinterest我用什么作为主键.当您查看URL时,您会看到如下内容:

http://pinterest.com/pin/275001120966638272/
Run Code Online (Sandbox Code Playgroud)

我更喜欢数字表示,即使是存储为字符串.有没有办法实现这个目标?

此外,youtube还使用了一种不同的散列技术,我无法弄清楚:

http://www.youtube.com/watch?v=kOXFLI6fd5A
Run Code Online (Sandbox Code Playgroud)

这让我想起了缩短网址的方案.

我更喜欢最短的一个,但我知道它不能保证是唯一的.我首先考虑做这样的事情:

 DateTime dt1970 = new DateTime(1970, 1, 1);
 DateTime current = DateTime.Now;
 TimeSpan span = current - dt1970;
Run Code Online (Sandbox Code Playgroud)

结果示例:

1350433430523.66
Run Code Online (Sandbox Code Playgroud)

打印自1970年以来的总毫秒数,但如果我每秒有数十万次写入会发生什么.

我主要更喜欢非BIGINT自动增量解决方案,因为使用第三方工具扩展数据库以及不太有问题的备份/恢复功能会减少很少的麻烦,因为我可以在服务器之间传输数据,如果我想要的话.

另一种复杂的方法是根据我的应用定制解决方案.在数据库中,主键还将包含用户名(唯一且用户无法更改),因此我可以将名称的数值与毫秒数组合,这将为我提供唯一的数字字符串.由于用户不以如此高的速率插入数据,因此数字ID保证是唯一的.我也可以删除最后5个数字并仍然获得一个唯一的ID,因为我假设用户不会以每秒超过1的速度插入数据,但我可能不会这样做(你怎么看?这个想法?)

所以我请求你的帮助.我的数据假设增长非常大,每年2TB,每秒有10万个新行.我希望URL看起来尽可能"友好",并且不想使用"常规"GUID.

我正在使用ASP.NET 4.5和MySQL开发我的应用程序

谢谢.

asp.net friendly-url guid

7
推荐指数
2
解决办法
712
查看次数

是否有任何已知的UUID事件发生碰撞?

有没有人在野外经历过UUID碰撞?有人听过或读过一件事吗?你能提供任何细节吗?

random uuid probability collision

6
推荐指数
0
解决办法
3400
查看次数