Questions tagged «synchronization»

2
双向数据同步的最佳实践/模式
在我的工作中,经常会出现数据库系统之间的2路数据同步的想法。经典示例是两个稍微不同的CRM系统(例如,Raiser's Edge和Salesforce),并且需要在它们之间进行双向联系人数据同步。 撇开API的考虑,假设您有一个要同步的共享密钥,并且纯粹考虑要使用的算法/模式,这是非技术人员经常低估的一项任务。 例如,您必须当心: 您可以轻松地检测到两个系统中的哪些记录已更改(或者您必须比较两个系统之间的所有记录以检测更改) 如果要进行每N小时一次的同步,那么在两个系统中相同记录或多或少同时发生更改的情况下,如何处理冲突 如果您要进行实时同步(例如,一个系统中的更新会立即触发另一个系统的更新),如何处理由于错误或系统崩溃而导致的时间差异。 我个人可以考虑解决所有问题的方法,但是我想知道是否可以参考任何众所周知的模式,文献或最佳实践。

5
不变性是否完全消除了多处理器编程中对锁的需求?
第1部分 显然,不变性可以最大程度地减少多处理器编程中对锁的需求,但是它消除了这种需求吗?还是存在仅不变性还不够的情况?在我看来,您只能推迟处理和封装状态,直到大多数程序必须实际执行某些操作(更新数据存储,生成报告,引发异常等)之前。这样的动作能否始终不加锁地进行?扔掉每个对象并创建一个新对象而不是更改原始对象(对不变性的粗略看法)的纯粹行动是否提供了对进程间争用的绝对保护,还是有些仍然需要锁定的情况? 我知道很多函数式程序员和数学家都喜欢谈论“无副作用”,但是在“现实世界”中,所有事情都有副作用,即使这是执行机器指令所需的时间。我对理论/学术答案和实际/现实答案都感兴趣。 如果不变性是安全的,那么在给定某些界限或假设的情况下,我想知道“安全区”的边界到底是什么。可能的边界的一些示例: 输入输出 异常/错误 与其他语言编写的程序的交互 与其他机器(物理,虚拟或理论上的机器)的交互 特别感谢@JimmaHoffa 的评论,这开始了这个问题! 第2部分 多处理器编程通常用作优化技术-使某些代码运行更快。什么时候使用锁和不可变对象更快? 考虑到阿姆达尔定律所规定的限制,与可变对象锁定相比,什么时候可以实现更好的整体性能(考虑或不考虑垃圾收集器)? 摘要 我将这两个问题合并为一个,以尝试了解边界不变性在哪里作为线程问题的解决方案。

5
没有中央数据库
我有一个客户正在寻求构建处理非常敏感的数据(比银行/卡详细信息更敏感)的网站/移动应用/桌面应用。由于数据的敏感性,他们不想将其保存在中央数据库中,但他们仍然希望其应用程序进行同步(假设我将一些数据添加到了移动应用程序中,然后我希望能够转到我的移动应用程序中。桌面应用程序并看到相同的数据)。 我想不出一种不错的,可靠的方法来做到这一点,我不确定是否有一种方法。这就是为什么我在这里。有谁知道我该如何处理这些数据? 我正在考虑的一种解决方案是在每个应用程序上都有一个客户端数据库,该数据库将以某种方式在应用程序之间进行同步,我可以看到这是非常不可靠的,而且变得混乱。

1
雷迪斯vs Zookeeper
考虑到这两个服务器的用途完全不同,将它们进行比较似乎很愚蠢。但是,如果您考虑一下,他们可以做很多类似的事情:存储配置数据,分布式锁定,排队等。 我有一个Redis实例,该实例用于一些与生产相关的事情,但是想在服务器之间进行一些简单的同步(大多数配置更改不需要推升代码,也不需要在服务器之间进行简单锁定)。什么是动物园管理员给我的Redis不会?

3
双向同步的冲突解决
假设连接并不总是可用的,您如何管理“主”数据库服务器和许多“辅助”服务器之间的双向同步,特别是解决冲突? 例如,我有一个移动应用程序,该应用程序使用CoreData作为iOS上的“数据库”,并且我希望允许用户在没有Internet连接的情况下编辑内容。同时,此信息可在设备将连接到的网站上找到。如果/当两个数据库服务器上的数据发生冲突时,该怎么办? (尽管我知道CoreData有点不同,但我将其称为DB服务器。) 是否有处理此类问题的一般策略?这些是我可以想到的选项: 1.始终将客户端数据用作更高优先级 2.与服务器端相同 。3.尝试通过标记每个字段的编辑时间戳并进行最新编辑来解决冲突。 尽管我敢肯定,第三个选项会为破坏性的数据破坏打开空间。 我知道CAP定理与此有关,但是我只想最终保持一致,所以不能完全排除它,对吗? 相关问题:双向数据同步的最佳实践模式。对这个问题的第二个回答说,这可能无法完成。

4
在两个不同数据库之间同步数据的最佳方法
我必须在结构完全不同的两个大型数据库之间实现数据同步。基本上,我需要获取有关第一个数据库中不同表中产品的一些数据,并将它们重新排列为第二个数据库中的其他表。 第一次创建我的产品并不是很复杂。但是我正在寻找一种方法来更新有关每种产品的某些特定数据,而不是所有数据。 显然,有一些问题使这个问题变得棘手。 除了选择查询,我不允许对源数据库执行任何操作。 在目标数据库上,我可以执行常规查询(选择,更新,插入,创建),但不能修改现有的结构/表。 目标数据库和源数据库的结构完全不同,表根本不一样,因此,实际上必须重新排列数据-比较表将无法工作。 目标数据库使用MySQL服务器-源可能是DB2。 任何地方都没有“更新时间”字段。 因此,整个过程需要在单个Python(理想情况下)脚本中完成。 我考虑根据要在目标数据库中更新的字段为每个产品创建一个哈希:md5(代码+描述+供应商+大约10个其他字段)。每天都会从源数据库中创建基于相同数据的新哈希。我将所有散列存储在一个表(项目代码,current_hash,old_hash)中,以提高性能。然后,如果新哈希与旧哈希不同,则比较并更新产品。 大约有50万种产品,所以我有点担心性能。 这是个好方法吗?

9
多线程同步面试问题:给定m个线程,找到n个单词
有没有办法可以从具有多个线程而不是单个线程的解决方案中受益于此问题? 在一次采访中,我被要求使用多个线程解决问题。在我看来,多个线程毫无益处。 这是问题所在: 给您一个段落,其中包含n个单词,给您m个线程。您需要做的是,每个线程应打印一个单词并将控制权交给下一个线程,这样每个线程将继续打印一个单词,以防最后一个线程到来,它应调用第一个线程。重复打印,直到段落中所有单词都打印完为止。最后,所有线程都应正常退出。将使用哪种同步? 我强烈感到我们无法利用这里的线程,但相信面试官正在尝试评估我的同步技能。我是否在此问题中缺少使多个线程有价值的内容? 无需编写代码,只需提出一些想法即可。我将自己执行。

5
您如何最好地在REST API中表示双向同步?
假设系统中有一个带资源的Web应用程序,以及另一个具有类似资源的远程应用程序的引用,那么您如何表示双向同步操作,该操作将“本地”资源与“远程”资源同步? 例: 我有一个代表待办事项清单的API。 GET / POST / PUT / DELETE / todos /等 该API可以引用远程TODO服务。 GET / POST / PUT / DELETE / todo_services /等 我可以通过我的API作为代理通过远程服务来处理待办事项 GET / POST / PUT / DELETE / todo_services / abc123 /等 我希望能够在本地待办事项集和远程待办事项集之间进行双向同步。 以一种rpc的方式, POST / todo_services / abc123 / sync / 但是,在“动词很糟糕”的想法中,是否有更好的方法来表示此动作?

2
什么时候应该使用StringBuilder或StringBuffer?
在生产型Web应用程序中,我的同伴程序员在各处都使用StringBuffer。现在,我负责应用程序的开发和更正。阅读StringBuilder和StringBuffer之后,我决定将所有StringBuffer代码替换为StringBuilder,因为我们不需要数据bean中的线程安全。 例如:(在每个数据bean中,我都可以看到StringBuffer的使用) @Override public String toString() { StringBuffer sb = new StringBuffer();// replace it from StringBuilder sb.append(" ABCD : ").append(abcd); sb.append(", EFGH : ").append(efgh); sb.append(", IJKL : ").append(ijkl); } 我们为每个会话/请求创建一个单独的数据bean。会话由单个用户使用,其他用户无法访问它。 在迁移之前,我还应该考虑其他几点吗? 如果只有一个线程(没有等待线程/没有新线程将寻找对象锁定),则它与StringBuffer或StringBuilder的性能相同。我知道在使用StringBuffer的情况下,需要花费时间来获取对象锁,但是我想知道除了保持/释放对象锁外,它们之间是否存在任何性能差异。

3
显式DAG代替矢量时钟进行同步
我已经开始研究在一组同级之间进行数据同步的方法。对等方必须能够以断开连接的方式工作,然后同步在一起以合并其本地更改。 对等方应该能够使用“三种方式合并”来合并本地更新。因此,在同步时,对等方应该知道哪些事实是最新的,但是在没有严格排序的地方,他们应该能够基于公共根将这些事实合并在一起。 当独立的同级进行更改时,他们可以使用“时钟”为它们“打上时间戳”。我使用术语“时钟”和“时间戳”,但我不是在说壁钟。我的意思是某种事件的部分排序,使因果关系清晰明了。事件之间的“先发生”关系形成有向无环图(DAG)。 似乎使用矢量时钟来构建这种部分排序的“通常”方法。但是,这些可能会变得非常大。间隔树时钟等最新发展提供了更紧凑的时间戳存储。 我根本不清楚的是,为什么同步协议显然不会“简单地”显式存储DAG。(或者他们?) 对等方可以通过随机生成UUID(或通过其他方法,例如<peer-name> + <local-monotonically-increasing-counter>)来独立创建时间戳。该时间戳的顺序对于该对等点是完全清楚的。 当两个对等方彼此同步时,他们可以商定新的时间戳。同样,此时间戳的顺序对双方均清晰可见。 现在需要在对等方之间传递DAG之前发生的事件,但是此操作的存储和带宽要求很小。时间点是图顶点。因此,它们具有1个或2个传入边(1个用于客户端上的事件,2个用于客户端之间的同步)。这是有界的,与网络中对等方的数量无关。 要使用单个时间点,您需要导致该时间点的时间图。然而,据我所看到的,任何对即能知道的时间点(它产生它本身,或与其他同行产生的,或者与它同步时已被其他同行告诉它)已经也有有机会了解到那个时间点之前的历史。我认为可能有一个归纳证明。 鉴于显式地存储和同步DAG似乎很简单:在实践中使用了吗?如果不是,为什么首选矢量时钟? 笔记 点对点 与客户端服务器解决方案相比,我更喜欢对等解决方案。 可能的最终拓扑将是许多客户端连接到在彼此之间复制的一小得多的服务器组。但是,最好有一个支持该特定拓扑的通用解决方案,而不是一个需要此特定拓扑的解决方案。

1
是时候弃用同步,等待并通知了吗?
是否有一个场景(除了与古代JVM的兼容性以外),使用场景比synchronized使用Lock?谁能证明使用wait或使用notify较新的系统? 是否有任何算法必须在实现中使用其中之一? 我看到先前的问题涉及到此问题,但我想更进一步,实际上是deprecate这些问题。新设施已经消除了太多的陷阱,陷阱和警告。我只是觉得可能快要把它们标记为过时了。

2
使用MongoDB作为变更日志的两个系统之间的同步
我们正在开发两个相关的系统。其中一个(A)将安装在我们客户的机器上。其余(B)将由我的组织使用。 每个系统都有其自己的数据库(关系型),并且其架构也不同。但是,两个系统都必须同步。另外,必须将B中的某些更改导出到所有A类系统,而其他仅导出到特定的系统。 有些客户没有Internet连接,因此在某些情况下,必须通过交换文件来完成同步。 因此,我们正计划解决以下问题: 每个系统都维护其数据库的变更日志。我们计划用MongoDB实施它。 当系统初始化同步过程时,它将从日志中检索所有进行的更改。如果系统是B,则检索到的更改取决于目标。然后,系统以XML格式对它们进行序列化,最后(通过文件或网络)发送它们。 当另一端点接收到变更集时,它将对它们进行反序列化。然后,系统对数据进行一些必要的转换,最后记录所做的更改。在这一步中,如果有必要,系统必须解决可能存在的冲突。 最后,接收器系统发送其更改(以及其他解决冲突的产品)。 这种方法可行,可扩展且优雅吗?您将进行哪些更改或添加?

2
与离线系统同步
我正在设计一个系统,通过该系统,我将同步移动设备(具有嵌入式应用程序)中的业务数据,该数据会生成数据并将其发送回服务器。同步的每一行都会在数据库中生成特定的业务日志。 如果我同步的数据生成的日期(在同步数据内)晚于我的业务数据的最后修改日期,则我必须忽略它,而只需在数据库中添加日志即可。处理上载的数据后,将从数据库中获取数据并将其下载到设备。 由于写完后立即下载,同步必须是同步的。如果像这样的东西足以取代我现有的解决方案,那么仍然有可能采用读写器模式。更重要的是能够下载最新数据。该数据是整体获取的,目前没有实现差异(它可能会在以后出现,但这不会成为问题)。 我可能在同一个业务对象上运行多个同步,这不太可能,但是可能会发生,我希望能够处理它。除非使用嵌入式移动应用程序几天不重新同步,否则预计同步将持续几秒钟但不会持续几分钟。 同步处理的数据量预计不会很大。 因此,我最终在我的同步方法上使用了互斥,更确切地说,我正在使用Java,并且在写入方法上放置了同步,而不是整个同步过程都放在不阻止只读同步的位置。 我想知道 : 这样是否有意义?只要同步过程的数量和时间仍然可以接受。 一般来说,我应该看什么概念。奖励:Spring模块中是否有这些概念的实现。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.